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++?
Umm .... Oui? Je ne suis pas vraiment sûr de la réponse que vous cherchez. – jalf
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 –
sent comme LTO/optimisation du programme entier, qui est une option spécifique de MSVC – Necrolis