2010-10-17 2 views
1

Для объектов или примитивных данных с размером, равным или меньшим, чем размер указателя, наиболее эффективный метод передачи функции будет определенно по значению, но я хочу знать, есть ли какой-либо инструмент, способный определять лучший метод прохождения объектов классов или примитивных данных с размерами, большими, чем размер указателя на функции на платформе, как что-то из инструментов повышения?Любой инструмент для определения наиболее эффективного способа передачи данных по ссылке или по значению?

+0

Профилировщик или микропрофилер? – Necrolis

+0

@ Necrolis_How'd он способен выполнять работу? – Pooria

ответ

4

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

Компилятор не гарантирован или не требуется для оптимизации, но если это не так, это, вероятно, небрежное достижение производительности, так что не стоит беспокоиться.

+0

Это может работать и наоборот: если вы передадите по значению, компилятор также сможет выполнить копирование, исключая копию. Таким образом, в любом случае, компилятор попытается сделать ваш код быстрым. :) – jalf

+1

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

+0

Существует несколько сценариев, в которых вы обязательно захотите пройти по значению: http://cpp-next.com/archive/2009/08/want-speed-pass-by-value/ –

6

Да, Boost имеет то, что называется call traits. Но его высокая стоимость нечитаемости выше, чем микроскопический выигрыш в эффективности. По моему скромному мнению.

Приветствия & НТН.,

+0

Спасибо за ссылку. Теперь я знаю, что означает «лучший метод» :-). –

5

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

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

+0

+1 для «Преждевременная оптимизация - это корень всего зла». – JoshD

+0

«Преждевременная оптимизация - это корень всего зла». Вот почему я начал эту тему! ;) – Pooria

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