Разница в производительности между разыменованием нескольких указателей и ссылками

Несколько месяцев назад я задавал этот вопрос на собеседовании:

Какая из следующих функций будет выполняться быстрее , 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 «может быть» быстрее . Они не были впечатлены ...

Это раздражало меня несколько раз, когда я наткнулся на код, похожий на этот (или написал его) и хотел бы знать, что мне делать в таком случае.

Я знаю, что ...

  1. Это микро-оптимизация
  2. Компилятор, скорее всего, оптимизирует его

РЕДАКТИРОВАТЬ: Я изменил код немного, так что теперь он проверка указателя NULL.

8
задан Samaursa 28 April 2011 в 16:46
поделиться