2017-01-06 3 views
-2

CppCoreGuidelines говорит, что быстрее передавать мелкие объекты (до двух или трех слов) по значению, чем по ссылке, из-за некоторых накладных расходов, необходимых для доступа к функции. Можете ли вы объяснить мне, каковы именно накладные расходы в этом случае?Почему быстрее передавать int по значению, чем по ссылке?

+2

Очень связанный: http://stackoverflow.com/questions/26387569/rule-of-thumb-for-when-passing-by-value-is-faster-than-passing-by-const-referenc – NathanOliver

+2

I ' м, чтобы закрыть этот вопрос, потому что непонятно, что вы спрашиваете, поскольку точная ссылка, которую вы даете, содержит точный ответ на вопрос: * «Что« дешево копировать »зависит от архитектуры машины, но два или три слова (двойники, указатели, ссылки) обычно лучше всего передаются по значению. * «Если вы не понимаете, например, какие слова или почему машинная архитектура влияет на это правило, тогда вы должны перефразировать вопрос. –

ответ

4

Накладные расходы заключаются в том, что такие ссылки включают косвенное обращение, которое обычно выполняется за кулисами с помощью указателя. Таким образом, у вас есть операция разыменования, вес которой не суммируется с какой-либо заметной выгодой для такого небольшого объема данных.

страница связывание буквально объясняет это:

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

+0

Я видел это, но ожидал увидеть более аргументированный ответ (инструкции ассемблера, подсчет байтов и т. Д.). – logumanov

+2

@logumanov: Я не совсем понимаю, какая дополнительная аргументация вам нужна, и нам не нужно вдаваться в такие детали реализации на низком уровне, чтобы знать, что косвенность имеет стоимость, и вы не берете на себя стоимость, когда вы ничего не получают взамен. –

+1

@logumanov: Как я уже говорил в другом месте, вопрос был слишком расплывчатым. Вы буквально разместили ссылку на объяснение, и ваш вопрос сводился к: «Я этого не понимаю». Вопрос о технических деталях, конечно же, приветствуется в Stack Overflow, но вам нужно на самом деле * спросить их с тем же вниманием к деталям! :) –

5

Документ также дает вам объяснение - вы вводите дополнительную косвенность. По крайней мере, вам нужно разыменовать указатель, который вам не нужен. В нем также объясняется, какие подходы бывают быстрыми и медленными (и почему).

Это не значит, что вы обязательно заботитесь - если вы не находитесь в горячей части вашего кода, разница на самом деле не имеет значения.

+2

Обратите внимание, что до тех пор, пока ваш код будет const-correct и до тех пор, пока вы включите некоторую оптимизацию (что вам нужно, если вы вообще не заботитесь о производительности), компилятор почти наверняка оптимизирует такие вещи. На практике реальные накладные расходы - это потраченное время, пытаясь «оптимизировать» мелочи, которые уже оптимизирует компилятор. – 0x5453

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