为什么#pragma optimize("", off)
Why #pragma optimize("", off)
我正在审阅 C++ MFC 项目。在一些文件的开头有这一行:
#pragma optimize("", off)
我知道这会关闭以下所有功能的优化。但是这样做的动机通常是什么?
我见过生产代码,它是正确的,但太复杂了,以至于它使优化器产生了错误的输出。这可能是关闭优化的原因。
但是,我认为更有可能是代码存在错误,具有未定义的行为。优化器暴露了这一点并导致不正确的运行时行为或崩溃。如果没有优化,代码恰好 "work." 而不是找到并消除潜在的问题,有人 "fixed" 通过禁用优化并将其留在那。
当然,这是最脆弱的解决方法。新硬件,新 OS 补丁,新编译器补丁,任何一个都可以破解 "fix."
即使出于第一个原因存在 pragma,也应该对其进行大量记录。
我专门使用它来在一组特定的代码中获得更好的调试信息,而应用程序的其余部分是在优化的情况下编译的。当 运行 由于应用程序的性能要求而无法进行完整的调试构建时,这非常有用。
我知道这是一个老话题,但我想补充一点,使用这个指令还有另一个原因——尽管与大多数应用程序开发人员无关。
在编写设备驱动程序或其他低级代码时,优化器有时会产生无法与硬件正确交互的输出。
例如,需要读取内存映射寄存器(但不使用读取的值)来清除中断的代码可能会被编译器优化,生成汇编代码那行不通。
这也可以说明为什么(如 Angew 指出的那样)应该清楚地记录此指令的使用。
将这些放在代码库中的另一个替代原因......这是一个意外。
这是一个非常方便的工具,用于在调试时关闭特定文件的优化器 - 正如 Ray 上面提到的。
如果在提交之前没有仔细审查更改列表,这些行很容易进入代码库,原因很简单,因为在提交其他更改时它们 'accidentally' 仍然存在。
它允许您在发布模式下进行调试。
我正在审阅 C++ MFC 项目。在一些文件的开头有这一行:
#pragma optimize("", off)
我知道这会关闭以下所有功能的优化。但是这样做的动机通常是什么?
我见过生产代码,它是正确的,但太复杂了,以至于它使优化器产生了错误的输出。这可能是关闭优化的原因。
但是,我认为更有可能是代码存在错误,具有未定义的行为。优化器暴露了这一点并导致不正确的运行时行为或崩溃。如果没有优化,代码恰好 "work." 而不是找到并消除潜在的问题,有人 "fixed" 通过禁用优化并将其留在那。
当然,这是最脆弱的解决方法。新硬件,新 OS 补丁,新编译器补丁,任何一个都可以破解 "fix."
即使出于第一个原因存在 pragma,也应该对其进行大量记录。
我专门使用它来在一组特定的代码中获得更好的调试信息,而应用程序的其余部分是在优化的情况下编译的。当 运行 由于应用程序的性能要求而无法进行完整的调试构建时,这非常有用。
我知道这是一个老话题,但我想补充一点,使用这个指令还有另一个原因——尽管与大多数应用程序开发人员无关。
在编写设备驱动程序或其他低级代码时,优化器有时会产生无法与硬件正确交互的输出。
例如,需要读取内存映射寄存器(但不使用读取的值)来清除中断的代码可能会被编译器优化,生成汇编代码那行不通。
这也可以说明为什么(如 Angew 指出的那样)应该清楚地记录此指令的使用。
将这些放在代码库中的另一个替代原因......这是一个意外。
这是一个非常方便的工具,用于在调试时关闭特定文件的优化器 - 正如 Ray 上面提到的。
如果在提交之前没有仔细审查更改列表,这些行很容易进入代码库,原因很简单,因为在提交其他更改时它们 'accidentally' 仍然存在。
它允许您在发布模式下进行调试。