请考虑以下代码:
#include <iostream>
struct A {};
struct B {};
int func1(A *a, B *b, int c, double *d) {
int tmp = 0;
tmp = tmp;
return 1;
}
int func2(A *a, B *b, int c, double *d) {
return 1;
}
int main(int argc, char* argv[]) {
if (func1 == func2) {
std::cout << "equal" << std::endl;
} else {
std::cout << "not equal" << std::endl;
}
return 0;
}
在VS2013的Release配置中编译时,它打印出“相等”。我有一个库,它依赖于函数地址的比较。您可以想象它在Release中不能正常工作。有没有办法阻止VC ++中的这种优化?或者我应该提交错误吗?
答案 0 :(得分:24)
这是Microsoft的"feature"链接器,文档警告您
因为/ OPT:ICF可以导致分配相同的地址 不同的函数或只读数据成员(const变量 通过使用/ Gy)编译,它可以打破依赖于唯一的程序 函数或只读数据成员的地址。
您可以通过将/opt:noicf
传递给链接器来关闭它。