Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 具有不匹配优化级别(-O3,-O2,-O1,-O0)的二进制文件是否会导致稳定性问题?_C++_Interop_Compiler Optimization_Abi - Fatal编程技术网

C++ 具有不匹配优化级别(-O3,-O2,-O1,-O0)的二进制文件是否会导致稳定性问题?

C++ 具有不匹配优化级别(-O3,-O2,-O1,-O0)的二进制文件是否会导致稳定性问题?,c++,interop,compiler-optimization,abi,C++,Interop,Compiler Optimization,Abi,具有不匹配优化级别(-O3,-O2,-O1,-O0)的二进制文件是否会导致稳定性问题?例如,如果app.exe为-O2,libapp.so为-O3,或app.o为-O2,libxyz.a为-O3?通常为否,优化级别不匹配不会导致稳定性问题 理论上,一个写得特别糟糕的库可能会根据一个基于优化级别定义的实现定义的预处理器宏更改其二进制接口,在这种情况下可能会出现问题 这在我的经验中并不常见。一个更常见的问题是NDEBUG宏(以及类似的问题)。优化级别本身不能影响它,但优化级别经常与一些影响构建的宏相

具有不匹配优化级别(-O3,-O2,-O1,-O0)的二进制文件是否会导致稳定性问题?例如,如果app.exe为-O2,libapp.so为-O3,或app.o为-O2,libxyz.a为-O3?

通常为否,优化级别不匹配不会导致稳定性问题

理论上,一个写得特别糟糕的库可能会根据一个基于优化级别定义的实现定义的预处理器宏更改其二进制接口,在这种情况下可能会出现问题


这在我的经验中并不常见。一个更常见的问题是
NDEBUG
宏(以及类似的问题)。

优化级别本身不能影响它,但优化级别经常与一些影响构建的宏相耦合,从而导致ABI问题。例如,在MSVC中,在发布模式中构建的dll如果链接到调试模式应用程序,则可能会导致崩溃,如果它接受对
std::string
的引用作为某些函数的输入(而不应该在共享库中有一个
std::string
或对它的引用作为输入)

此外,如果库和应用程序是使用不同的编译器/选项构建的,那么如果库的接口使用任何复杂的类,则可能会出现一些ABI问题。您应该查看编译器文档以了解这些信息


此外,如果代码中有bug,那么优化级别可能会改变bug的行为,导致优化级别之间出现一些奇怪的不一致。

不应该这样做。你有一个特定的问题吗?如果你的代码中有UB,它似乎可以做到这一点。此外,如果您的编译器在优化部分有一个bug(但这些bug通常是“非常罕见的”),请想象链接多个使用不同优化级别编译的第三方库。如果这样做会导致稳定性问题,那么很可能只有一个优化级别,因为否则所有的代码都会被完全破坏。@AlanBirtles在所有情况下,你怎么能说它不会导致问题呢?我添加了一些标记。我不确定“编译器构造”在这里是否合适,但我把它留下了。无论如何,这是个有趣的问题!在您自己的应用程序的私有DLL中有一个
std::string
,这很好。问题在于在应用程序之间真正共享的共享库,可能是使用不同的编译器构建的。这不仅仅是记忆;每个人都使用什么字符集?Windows有
BSTR
可以避免这个问题。@MSalters
std::string
是围绕ASCII(在某些情况下是UTF8)构建的字符,这样就可以了,但是当将它转发给DLL时,代码<> STD::String 可能会有不同的结果,导致严重的问题。有保证优化级别不能改变代码行为吗?@ GuyouthGuy C++标准指定程序在某些情况下的行为。语言实现不得改变该行为的任何可见部分,否则它将不符合标准。这些情况之外的一些行为是实现定义的,标准对此没有任何保证。几乎所有现实世界的程序都使用实现定义的行为,所以。。。