Как сообщить оптимизатору 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С++? Или я должен указать ошибку?
Ответы
Ответ 1
Это "feature" Microsoft linker, и документация предупреждает вас, что
Потому что /OPT: ICF может привести к тому, что тот же адрес будет назначен различные функции или члены данных только для чтения (константные переменные скомпилированный с использованием /Gy ), он может разорвать программу, которая зависит от уникальной адреса для функций или данных для чтения.
Вы можете отключить его, передав /opt:noicf
в компоновщик.