Подтвердить что ты не робот

Как сообщить оптимизатору VС++ не объединять тела функций?

Рассмотрим следующий код:

#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;
}

При компиляции в конфигурации Release в VS2013 он выводит "equal". У меня есть библиотека, которая зависит от сравнения адресов функций. Вы можете себе представить, что в релизе это не работает. Есть ли способ предотвратить такую ​​оптимизацию в VС++? Или я должен указать ошибку?

4b9b3361

Ответ 1

Это "feature" Microsoft linker, и документация предупреждает вас, что

Потому что /OPT: ICF может привести к тому, что тот же адрес будет назначен различные функции или члены данных только для чтения (константные переменные скомпилированный с использованием /Gy ), он может разорвать программу, которая зависит от уникальной адреса для функций или данных для чтения.

Вы можете отключить его, передав /opt:noicf в компоновщик.