3

Мне нужно реализовать некоторые методы, подобные vector::emplace для моих собственных структур данных. В общем случае я бы реализовал их так, чтобы они поддерживали идеальную пересылку, то есть с rvalue-ссылками, std::forward и т. Д.Совершенная пересылка примитивных типов

Однако, если я знаю, что все параметры для пересылки являются примитивными типами, такими как int или float. Имеет ли смысл внедрять идеальную пересылку для примитивных типов?

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

template <typename... Args> 
void wrapper(Args&& ... args) { 
    func(std::forward<Args>(args)...); 
} 

и

template <typename... Args> 
void wrapper(Args ... args) { 
    func(args...); 
} 

Дополнительно: Есть ли разница, если мы знаем, что параметры шаблона могут быть только классы, которые содержат только примитивные типы? Или классы, содержащие только примитивные типы и другие классы, которые сами по себе содержат только примитивные типы?

+0

Ваш «дополнительный» вопрос не имеет смысла. Игнорируя распределитель, простая реализация 'vector' содержит только три указателя. Предположительно, вы имеете в виду что-то о POD или тому подобное? –

+0

Я не вижу, с чем связана реализация «std :: vector» с моим вопросом. В принципе, вопрос вообще не имеет отношения к векторам. «Дополнительный» вопрос просто: существует ли разница между обеими частями кода, если все параметры шаблона являются структурами/классами, которые содержат только примитивные типы в качестве членов. – user1494080

+0

Вектор содержит три указателя, указатели являются примитивными типами, поэтому это «класс, который содержит только примитивные типы», но, очевидно, вам нужно идеально переслать вектор. –

ответ

4

Нет, это абсолютно не имеет никакого смысла использовать идеальный переадресацию для основных типов:

  1. Копирование эквивалентно перемещению их.
  2. Копирование их стоит примерно одинаково или меньше (из-за других оптимизаций и, особенно, сглаживания указателей), чем передача по ссылке.
  3. Лучший код - это код, которого нет.

Существует одно исключение, хотя:
Там нет никакого способа, чтобы избежать принятия выходных-параметров по ссылке.

Кроме того, если вы все равно пишете шаблон, вы абсолютно уверены, что никогда не захотите использовать его с более сложными типами?
YAGNI (вам это не понадобится) очень важно, но не гандикапируйте себя позже, иначе не ограничивая свой интерфейс.

И всегда помните старую пословицу «Преждевременная оптимизация - это корень всего зла».

+0

Зависит от того, может ли 'func' что-то взять по ссылке, нет? –

+0

@ T.C .: Вы имеете в виду выходные параметры? – Deduplicator

+0

Насколько я понимаю ваш ответ, это также справедливо в тех случаях, которые я описал в конце моего вопроса, правильно? – user1494080

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

  • Нет связанных вопросов^_^