Несколько месяцев назад я задавал этот вопрос на собеседовании:
Какая из следующих функций будет выполняться быстрее , Foo1
или Foo2
?
void Foo(SomeObjectArray** array, unsigned int size)
{
for (int i = 0; i < size; i++)
{
if (((*array) + i) != NULL)
{
((*array) + i)->Operation1();
((*array) + i)->Operation2();
((*array) + i)->Operation3();
((*array) + i)->Operation4();
((*array) + i)->Operation5();
((*array) + i)->Operation6();
}
}
void Foo(SomeObjectArray** array, unsigned int size)
{
for (int i = 0; i < size; i++)
{
if (*((*array) + i) != NULL)
{
Object& obj = *((*array) + i);
obj.Operation1();
obj.Operation2();
obj.Operation3();
obj.Operation4();
obj.Operation5();
obj.Operation6();
}
}
}
Обратите внимание, что это из памяти, поэтому я не помню точно код, но общая идея та же. Одна функция использует указатель в то время как другой использует ссылку (у него может быть указатель на массив, как в приведенном выше коде, но я точно не помню). Я сказал Я не уверен, и мне придется профилировать код, чтобы узнать , но если бы мне пришлось предположить, что Foo2 «может быть» быстрее
. Они не были впечатлены ...
Это раздражало меня несколько раз, когда я наткнулся на код, похожий на этот (или написал его) и хотел бы знать, что мне делать в таком случае.
Я знаю, что ...
РЕДАКТИРОВАТЬ: Я изменил код немного, так что теперь он проверка указателя NULL.