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%。相关阅读: