C++ 如何告诉VC++;优化器不合并函数体?
考虑以下代码:C++ 如何告诉VC++;优化器不合并函数体?,c++,visual-studio-2013,C++,Visual Studio 2013,考虑以下代码: #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[]) {
#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;
}
#包括
结构A{};
结构B{};
int func1(A*A,B*B,int c,double*d){
int-tmp=0;
tmp=tmp;
返回1;
}
int func2(A*A,B*B,int c,double*d){
返回1;
}
int main(int argc,char*argv[]){
if(func1==func2){
std::cout这是Microsoft linker的一个示例,文档警告您
因为/OPT:ICF可以导致将相同的地址分配给
不同的函数或只读数据成员(常量变量
通过使用/Gy编译),它可以中断依赖于唯一性的程序
函数或只读数据成员的地址
您可以通过将/opt:noicf
传递到链接器来关闭它。您的命令行选项是什么?在此处打印不相等的。[expr.eq]/2“如果两个指针都为null,都指向相同的函数,或者都表示相同的地址,则两个指针比较相等,否则它们比较不相等。”这是一个bug。@ ReMyabelEngultIt通过代码<> /O2。这是MSCVLAN中的COMDAT折叠,MSCV积极地使用它超出C++允许的范围。这根本不是一个bug:指针比较相等,因为这两个都代表相同的地址。我不知道C++规范中的任何东西,说明不同的函数应该有不同的地址。s可能是库作者的错误假设。@noxmetus注意成本:大量二进制膨胀。定义“大量”。在我的案例中(在实际应用程序中,而不是在我发布的示例中),“膨胀”占0.4%。相关阅读: