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

时间:2014-08-25 23:50:06

标签: 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;
}

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

1 个答案:

答案 0 :(得分:24)

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

  

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

您可以通过将/opt:noicf传递给链接器来关闭它。