«Эффективность» передачи size_t в качестве аргумента - PullRequest
3 голосов
/ 04 февраля 2011

Поскольку size_t может быть 32-разрядным или 64-разрядным, в зависимости от текущей системы, лучше ли всегда передавать size_t в функцию в качестве ссылки или константной ссылки, чтобы она всегда составляла 4 байта?(если это 8 байт, вам придется сделать копию). Многие открытые исходные коды, на которые я смотрел, не делают этого, однако, если их компилятор поддерживает 64-битные целые, эти 64-битные целые всегда передаются как ссылки.Почему они не делают это для size_t?Мне интересно, что ты думаешь.

Ответы [ 5 ]

13 голосов
/ 04 февраля 2011

Обычно все примитивные типы передаются по значению, поскольку операции, необходимые для их копирования, обычно представляют собой всего лишь одну инструкцию сборки. Поэтому передача size_t s по значению предпочтительнее, чем передача size_t s по ссылке.

6 голосов
/ 04 февраля 2011

В большинстве реализаций size_t указатели на объекты и ссылки на объекты имеют одинаковый размер.

Думайте об этом следующим образом: size_t может содержать размер любого объекта, и вы можете использовать char* для адресации любого байта в любом объекте, поэтому это означает, что size_t и char* должны иметь тесно связанные размеры. Таким образом, ваша идея не имеет смысла в большинстве реализаций.

3 голосов
/ 04 февраля 2011

Проблема с передачей по ссылке заключается в том, что компилятору потребуется сохранить значение в памяти и передать адрес этого сохраненного значения в качестве ссылки.В 64-битной архитектуре соглашения о вызовах позволяют передавать гораздо больше информации в регистры (6 регистров) без необходимости хранить значения в памяти, поэтому вы бы запретили оптимизацию, передавая небольшие значения по ссылке.

Существует большена этот вопрос вы можете начать с:

http://cpp -next.com / archive / 2009/08 / want-speed-pass-by-value /

http://en.wikipedia.org/wiki/X86_calling_conventions#x86-64_Calling_Conventions

3 голосов
/ 04 февраля 2011

size_t гарантированно может содержать размер в байтах любого объекта, который вы можете выделить в памяти.Обычно это означает, что он имеет тот же размер, что и указатель, который, в свою очередь, обычно равен размеру регистра ЦП.

Передача по ссылке не помогает;указатель почти наверняка равен по крайней мере размера size_t (если нет, то size_t можно было бы уменьшить без проблем).И в любом случае, большинство 64-битных ABI в любом случае передают целочисленные аргументы в 64-битных регистрах, поэтому разницы в размере стека нет.

3 голосов
/ 04 февраля 2011

Я не совсем следовал вашей логике. Если вы передадите по ссылке, адрес будет 32-битным или 64-битным, в зависимости от текущей системы.

Во всяком случае, я не вижу никакого преимущества в передаче его по ссылке.

...