Ну, почему бы нам не взглянуть на сгенерированный код сборки, полная оптимизация под 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
будет по крайней мере так же быстро, как наивная реализация, такая как цикл. Попробуйте его в отладочной сборке, и вы заметите, что цикл не заменен.Тем не менее, это зависит от того, что компилятор сделает для вас. Просмотр разборки - это всегда хороший способ точно знать, что происходит.