Посмотрите на этот гипотетический файл заголовка:Могу ли я позволить компилятору C++ решить, следует ли передавать по значению или передавать по ссылке?
template <class T>
class HungryHippo {
public:
void ingest(const T& object);
private:
...
}
Теперь для HungryHippo<string>
это имеет смысл, что вы хотели бы ingest
ссылки на струнах - копирование строки может быть очень дорого! Но для HungryHippo<int>
это делает путь менее ощутимым. Передача int
напрямую может быть действительно дешевой (большинство компиляторов сделает это в регистре), но передача ссылки на int
- лишний ненужный уровень косвенности. Все это относится и к возвращающим значениям.
Есть ли способ предложить компилятору «эй, я не собираюсь изменять аргумент, так что вы решаете, следует ли передавать по значению или по ссылке, в зависимости от того, что, по вашему мнению, лучше»?
некоторые вещи, которые могут иметь отношение:
- Я может фальсифицировать этот эффект вручную написания
template <class T, bool PassByValue> class HungryHippo
и затем, специализирующихся наPassByValue
. Если бы я хотел получить действительно фантазию, я мог бы даже выслатьPassByValue
на основеsizeof(T)
иstd::is_trivially_copyable<T>
. В любом случае, это большая часть дополнительной работы, когда реализации будут выглядеть примерно одинаково, и я подозреваю, что компилятор может намного лучше решить, передавать ли значение по значению, чем я могу. -
Проект libc++, похоже, решает эту проблему, встраивая множество функций, поэтому компилятор может сделать выбор на один уровень выше, но в этом случае реализацияКак поясняется в комментариях, все функции шаблона по умолчанию равныingest
довольно сложна и не стоит встраивать.inline
.
Что-то для рассмотрения: это звучит как хороший случай преждевременной оптимизации. Из-за этой архитектуры возникают проблемы с производительностью? Если нет, вы должны просто делать то, что имеет смысл семантически. –
Для целых чисел передача по ссылке почти такая же эффективная, как и передача по значению, поэтому константная ссылка хороша для обоих случаев. – dasblinkenlight
«в этом случае, скажем, реализация ingest довольно сложна и не стоит встраивать». В этом случае у вас нет выбора. Поскольку HungryHippo является шаблоном, он должен быть встроен. – cgmb