c++ - 暂时禁用const限定变量的优化? (在调试期间)

标签 c++ optimization constants

我有一个自己编写的复杂框架(很遗憾,我无法重写它,因此是我的问题),它涉及大量使用浮点数组。

这些浮点数组作为const float*在许多函数和对象之间传递。

但是,我需要在代码的特定区域执行特殊的调试过程(对神经网络进行“梯度检查”)。它使我可以查看阵列输入的手动扰动是否会导致以后其他地方的期望值更改。如果没有,那么我在中间公式中会犯错误。

我写了一个工具,可以接受const数组并扰动其某些值。

结果,在此临时调试过程中,我使用重新解释转换将这些const float*转换为float*。这太可怕了,并导致不确定的行为。我修改了const数组中的值,并祈求它在运行此调试版本时不会中断(不是一半的时间)。

问题:

是否可以暂时阻止编译器在看到const float*的所有地方优化代码,只是为了让我有机会通过我的检查工具调试代码?

换句话说,这样我就可以安全地将const float*强制转换为float*

是否可以在代码中使用一些#define或Visual Studio的编译器标志?

我正在使用c++ 17和Visual Studio

接受答案后编辑

这次的问题不在 Actor 表中,而是在覆盖阵列外部的内存中。通过在Visual Studio和调用堆栈中使用Memory Watch断点,我能够找到发生中断的地方

最佳答案

I cast those const float* to float* using reinterpret cast. This is horrible and leads to undefined behavior.



抛弃const限定符本身并不会导致不确定的行为。如果您知道指向的对象是非常量,则可以使用const_cast<float*>删除常量限定符。您必须声明数组本身具有非常量存储。

Is it possible to temporarily prevent compiler from optimizing code everythwere where it sees const float* just to give me chance to debug my code, via my checking-tool?


const不是优化功能,它是类型安全功能。如果您的编译器隐式将const float*转换为float*,则它不是兼容的C++编译器。

Is there some #define that I could use in my code, or compiler flag for Visual Studio?



如果两种情况都需要编译此代码,则可以使用typedef来实现:
typedef float *flt_ptr;
//or
typedef const float *flt_ptr;

您仍然必须正确声明数组上的存储(使用第一个typedef时为非常量)。

许多人认为typedef指针不可读且容易出错(您必须记住现在不要在所有指针中使用*)。您最好在关键位置使用有限数量的const_cast,并确保原始数组是非常量的。

关于c++ - 暂时禁用const限定变量的优化? (在调试期间),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61472517/

相关文章:

c - 用C中的函数定义常量

c++ - `const` 作为移动构造函数的模板参数的效果

c++ - const 模板参数在创建后不保留 const-ness

c++ - 我们可以用 boost.asio 创建未命名的套接字来模拟匿名管道吗?

c++ - 当我们复制/分配派生类对象时,如何在继承中复制基类成员?

algorithm - 并行计算中的随机数生成器(MATLAB),每个并行循环中的初始随机数不同?

mysql - 优化计数和选择查询

javascript - 使用 JavaScript 中的动态事件优化 'Mediator' 模式 (V8)

c++ - 模板类声明 - 不是常量表达式

c++ - g++ 与 python.h,如何编译