17 votes

Comment indiquer à l'optimiseur de VC++ de ne pas fusionner les corps des fonctions ?

Considérons le code suivant :

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

Lorsqu'il est compilé en configuration Release dans VS2013, il affiche "equal". J'ai une bibliothèque qui dépend de la comparaison des adresses de fonctions. Vous pouvez imaginer que cela ne fonctionne pas très bien en configuration Release. Existe-t-il un moyen d'empêcher ce type d'optimisation dans VC++ ? Ou dois-je signaler un bogue ?

24voto

T.C. Points 22510

Il s'agit d'un "caractéristique" de l'éditeur de liens de Microsoft, et la documentation vous avertit que

Parce que /OPT:ICF peut faire en sorte qu'une même adresse soit attribuée à différents destinataires. diffe compilées à l'aide de /Gy), il peut interrompre un programme qui dépend d'adresses uniques pour les fonctions ou les membres de données en lecture seule (variables constantes). uniques pour les fonctions ou les membres de données en lecture seule.

Vous pouvez le désactiver en passant /opt:noicf à l'éditeur de liens.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X