2011-10-17 7 views
2

J'ai ce (plutôt inutile) Code:Est-ce que ce comportement inline étrange de Visual C++ est attendu?

__declspec(noinline) 
int foo(char* ptr, int offset) 
{ 
    if(5/offset == 3) { 
     return 1; 
    } 
    if(ptr != ptr + offset) { 
     return 2; 
    } 
    return 0; 
} 

int _tmain(int /*argc*/, _TCHAR* /*argv*/[]) 
{ 
    if(foo(0, 0)) { 
     rand(); 
    } 
} 

compiler que avec des optimisations sur et obtenir ce démontage:

141: __declspec(noinline) 
    142: int foo(char* ptr, int offset) 
    143: { 
    144: if(5/offset == 3) { 
00401000 push  5 
00401002 pop   eax 
00401003 cdq 
00401004 xor   ecx,ecx 
00401006 idiv  eax,ecx 
00401008 sub   eax,3 
0040100B neg   eax 
0040100D sbb   eax,eax 
0040100F inc   eax 
    145:  return 1; 
    146: } 
    147: if(ptr != ptr + offset) { 
    148:  return 2; 
    149: } 
    150: return 0; 
    151: } 
00401010 ret 
    152: 
    153: int _tmain(int /*argc*/, _TCHAR* /*argv*/[]) 
    154: { 
    155: if(foo(0, 0)) { 
00401011 call  foo (401000h) 
00401016 test  eax,eax 
00401018 je   wmain+0Fh (401020h) 
    156:  rand(); 
0040101A call  dword ptr [__imp__rand (4020A0h)] 
    157: } 
    158: } 
00401020 xor   eax,eax 
00401022 ret 

Le compilateur conservé un appel de fonction foo(), mais compilé foo() en propageant des paramètres connu au moment de la compilation dans le corps de la fonction et l'optimisation du code. Il a même émis

C4723 avertissement: diviser le potentiel de 0

Est-ce que le comportement attendu de Visual C++?

+2

Umm .... Oui? Je ne suis pas vraiment sûr de la réponse que vous cherchez. – jalf

+0

Juste pour référence, ce code est utilisé comme exemple de division par zéro à: http://stackoverflow.com/questions/7790272/is-dividing-by-zero-accompanied-with-a-runtime-error-ever-useful- in-c/7790459 # comment9489633_7790459 –

+0

sent comme LTO/optimisation du programme entier, qui est une option spécifique de MSVC – Necrolis

Répondre

3

Je suppose que oui. Vous lui avez dit de ne pas aligner la fonction, mais vous n'avez pas dit qu'elle ne pouvait pas modifier la fonction en fonction de la façon dont elle est utilisée. Il peut voir que la fonction est seulement appelée foo(0,0), alors pourquoi ne devrait-il pas optimiser la fonction pour cela?

essayez d'insérer un appel à quelque chose comme foo(1,2) en plus de l'appel (0,0) et voir ce qui se passe.

Questions connexes