Ожидается ли это странное встроенное поведение Visual C ++? - PullRequest
2 голосов
/ 17 октября 2011

У меня есть этот (довольно бесполезный) код:

 __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();
    }
 }

Я компилирую это с оптимизацией и получаю эту разборку:

    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

Компилятор сохранил вызов функции foo(), но скомпилировал foo() путем распространения параметров, известных во время компиляции, в тело функции и оптимизации кода. Он даже испускал

предупреждение C4723: потенциальное деление на 0

Это ожидаемое поведение Visual C ++?

1 Ответ

3 голосов
/ 17 октября 2011

Я так думаю.Вы сказали, что это не встроенная функция, но вы не сказали, что она не может изменять функцию в зависимости от того, как она используется.Он может видеть, что функция когда-либо вызывается только как foo(0,0), так почему бы не оптимизировать функцию для этого?

попробуйте вставить вызов в нечто вроде foo(1,2) в дополнение к (0,0)позвони и посмотри что получится.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...