Идеальная пересылка примитивных типов

Мне нужно реализовать некоторые методы, аналогичные 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...);
}

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

4

Решение

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

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

Есть одно исключение:
Нет способа избежать принятия выходных параметров по ссылке.

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

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

4

Другие решения


По вопросам рекламы [email protected]