Что ж, почему бы нам не взглянуть на сгенерированный ассемблерный код, полная оптимизация под VS 2010.
char x[500];
char y[500];
int i;
memset(x, 0, sizeof(x) );
003A1014 push 1F4h
003A1019 lea eax,[ebp-1F8h]
003A101F push 0
003A1021 push eax
003A1022 call memset (3A1844h)
И твоя петля ...
char x[500];
char y[500];
int i;
for( i = 0; i < 500; ++i )
{
x[i] = 0;
00E81014 push 1F4h
00E81019 lea eax,[ebp-1F8h]
00E8101F push 0
00E81021 push eax
00E81022 call memset (0E81844h)
/* note that this is *replacing* the loop,
not being called once for each iteration. */
}
Итак, в этом компиляторе сгенерированный код точно такой же. memset
работает быстро, а компилятор достаточно умен, чтобы знать, что вы в любом случае делаете то же самое, что и вызов memset
один раз, поэтому он делает это за вас.
Если компилятор на самом деле оставил цикл как есть, он, вероятно, будет медленнее, так как вы можете установить более одного блока размера байта за раз (то есть вы можете немного развернуть свой цикл как минимум. Вы можете предположить, что memset
будет по крайней мере так же быстро, как наивная реализация, такая как цикл. Попробуйте это в отладочной сборке, и вы заметите, что цикл не заменяется.
Тем не менее, это зависит от того, что компилятор делает за вас. Просмотр разборки - всегда хороший способ узнать, что именно происходит.
person
Ed S.
schedule
09.09.2011
char x[500] = {0};
, что не повлияет на скорость работы, но сделает код более приятным для меня. - person pmg   schedule 06.12.2018