所以我在2个单独的翻译单元中有这个代码:
// a.cpp
#include <stdio.h>
inline int func() { return 5; }
int proxy();
int main() { printf("%d", func() + proxy()); }
// b.cpp
inline int func() { return 6; }
int proxy() { return func(); }
Run Code Online (Sandbox Code Playgroud)
正常编译时,结果是10.当使用-O3(内联)编译时,我得到了11.
我已经明确做了ODR违规func().
当我开始将不同dll的来源合并为更少的dll时,它就出现了.
我试过了:
-Wodr(需要-flto)-detect-odr-violationsASAN_OPTIONS=detect_odr_violation=1在使用地址清理程序运行检测二进制文件之前进行设置.据称,Asan可以捕获其他ODR违规行为(具有不同类型或类似内容的全球变量......)
这是一个非常令人讨厌的C++问题,我很惊讶没有可靠的工具来检测它.
也许我误用了我试过的一种工具?或者是否有不同的工具?
编辑:
即使我使两个实现完全func()不同,这个问题仍然没有引起注意,因此它们不会被编译为相同数量的指令.
这也会影响类体内定义的类方法 - 它们是隐式内联的.
// a.cpp
struct A { int data; A() : data(5){} …Run Code Online (Sandbox Code Playgroud) 我刚刚inline在微软网站上研究了C++关键字的使用和好处/陷阱,我理解了所有这些.
我的问题是:如果编译器评估函数以查看内联它们是否会导致代码更高效且inline关键字只是编译器的建议,为什么还要烦恼关键字呢?
编辑:很多人都抱怨我的使用(还修复了网站链接)__inline而不是inline.我想指出的__inline是微软特有的:所以它没有错,它不一定是你习惯的.
EDIT2:重新格式化问题以指示inline关键字(在所有C++中使用)而不是特定于Microsoft的__inline关键字.