Я проверяю возможности оптимизации Visual C ++ 10 и обнаружил довольно любопытную вещь.Весь код здесь скомпилирован с /O2.
В следующем коде:
int _tmain(int argc, _TCHAR* argv[])
{
char buffer[1024] = {};
MessageBoxA( 0, buffer, buffer, 0 );
memset( buffer, 0, sizeof( buffer ) );
return 0;
}
вызов memset()
до return
исключен из машинного кода (я проверяю разборку).Это вполне разумно - если после этого нет чтения с buffer
, то memset()
бесполезно, и если разработчики действительно хотят перезаписать буфер, они могут вместо этого использовать SecureZeroMemory()
.
Однако в следующем коде:
int _tmain(int argc, _TCHAR* argv[])
{
char buffer[1024] = {};
MessageBoxA( 0, buffer, buffer, 0 );
memset( buffer, 0, sizeof( buffer ) );
Sleep( 0 ); //<<<<<<<<<<<<<<<<<<<<<<<<<<< Extra code
return 0;
}
звонок на memset()
не исключен.Этот вызов не влияет на наблюдаемое поведение и может быть устранен так же, как и в первом фрагменте.
Это может быть недостатком компилятора или каким-то образом полезным - я не могу решить.
Почему полезно оставить memset()
вызов в машинном коде, отправляемом для второго фрагмента?