如何告诉VC++优化器不要合并函数体?

fac*_*tus 17 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[]) {
    if (func1 == func2) {
        std::cout << "equal" << std::endl;
    } else {
        std::cout << "not equal" << std::endl;
    }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在VS2013中的Release配置中编译时,它打印出"相等".我有一个库,它依赖于函数地址的比较.您可以想象它在Release中不起作用.有没有办法阻止VC++中的这种优化?或者我应该提交错误?

T.C*_*.C. 24

这是Microsoft链接器的"功能",文档警告您

因为/ OPT:ICF可以将相同的地址分配给不同的函数或只读数据成员(使用/ Gy编译的const变量),它可以破坏依赖于函数或只读数据成员的唯一地址的程序.

您可以通过传递/opt:noicf给链接器将其关闭.

  • 定义"大规模".在我的情况下(在实际应用中,不在我发布的示例中),"膨胀"占0.4%. (8认同)