2012-09-13 2 views
6

В приведенном ниже примере кода я выделяю некоторые экземпляры struct Chunk. В циклах for я затем перебираю блок памяти и получаю доступ к различным экземплярам с помощью указателя или ссылок и назначаю им некоторые случайные данные.Какая скорость, доступ к указателю или доступ к ссылке?

Но какой цикл будет выполняться быстрее всего? По моим сведениям, я бы сказал, что эталонный цикл будет самым быстрым, потому что он не требует разыменования и имеет прямой доступ к экземпляру в памяти. Как я ошибаюсь/прав?

struct Chunk { 
    unsigned int a; 
    float b; 
    const char* c; 
}; 

int main() { 
    Chunk* pData = new Chunk[8]; 

    for(unsigned int i = 0; i < 8; ++i) { 
     Chunk* p = &pData[i]; 
     p->a = 1; 
     p->b = 1.0f; 
     p->c = "POINTERS"; 
    } 

    for(unsigned int i = 0; i < 8; ++i) { 
     Chunk& r = pData[i]; 
     r.a = 1; 
     r.b = 1.0f; 
     r.c = "REFERENCES"; 
    } 

    delete [] pData; 
    return 0; 
} 
+7

Зависит от вашего компилятора, я думаю, но с моим они скомпилируются по тому же самому коду. Большинство разработчиков C++ предпочитают ссылки в качестве стиля. –

+0

Помните, что ссылка похожа на указатель с автоматической привязкой. – tadman

+0

@tadman Не соответствует стандарту. –

ответ

10

Они должны быть одинаковыми (не о том же, но точно так же) с любым не идиотским компилятором. Под капотом, ссылки - указатели (на 99% компиляторов). Нет никакой разницы.

Педантичность: вторая петля может быть быстрее (вероятно, нет), потому что данные уже находятся в кеше, но это все. :)

+0

Пояснение для downvote? –

+0

Возможно, фанатик C, который любит стрелы лучше, чем амперсанды. – tadman

+2

Не 100% правильно. Ссылки не являются указателями, они вообще не являются объектами. Они могут быть реализованы указателями в нескольких случаях, но не на 100%. И код, созданный для указателя и ссылки, может отличаться. – Rost

1

Не должно быть различий в коде, создаваемом любым достойным компилятором.

1

Если вы сомневаетесь в двух версиях кода, подобных тем, что указаны в вашем примере, вы должны выбрать один из более читаемых. Предполагаемая оптимизация предлагаемого вами вида должна выполняться компилятором.

Более читаемым в вашем случае является скорее версия со ссылками (на самом деле, может быть, не очень читаемая, но консенсус заключается в том, чтобы предпочесть использование ссылок, поскольку указатели более «опасны»).

Но вернемся к эффективности: (пожалуйста, если кто-то знает ассемблер, лучше прекратите чтение или вы рискуете атакой смеха ...) На мой взгляд, поскольку pData размещается в куче, компилятор должен будет скомпилировать его используя указатели в любом случае. Я думаю, что ваши рассуждения могут быть правильными, если ваша структура была выделена в стек только с «Chunk data [8];». Но, наконец, когда оптимизация компилятора на разнице должна быть удалена в любом случае.

1

У меня возникает соблазн сказать: кто заботится? Любая разница в скорости будет пренебрежимо малой, и вы должны выбрать наиболее читаемый. В этом конкретном случае я ожидал бы увидеть точно такой же код, сгенерированный как в случае . В более сложных случаях компилятор может быть не в состоянии определить позже в цикле, что указатель не был повторно установлен, и , возможно, придется перечитать его. Но для этого вам нужно было бы делать достаточно других вещей, чтобы разница не измерима.

+0

Благодарим вас за ответ. Это, как вы могли заметить, не настоящий мир. Мне просто интересно, что я должен выбрать в более сложном сценарии. –

+0

@MichaelMancilla Какой бы ни выражал лучшее, что вы хотите сделать. Как правило, ссылайтесь, когда это возможно, и указатель в противном случае. Использование ссылки сообщает читателю (и компилятору), что упомянутый объект не изменится. –

+0

«Любая разница в скорости будет незначительной». Ваш прецедент не является чем-то вроде elses. – easytiger

Смежные вопросы