2016-10-12 10 views
1

Предположим, я хочу реализовать простую математическую функцию; например, предположим, что это повторная реализация (C++ 17's) std::clamp: эта функция принимает число, нижнюю границу и верхнюю границу и устанавливает число в одну из этих границ, если оно выходит за пределы диапазона, который они определяют. Если это конкретный числовой тип, скажем int, я хотел бы написать:Должны ли шаблонные математические функции принимать значения или константные ссылки?

constexpr int clamp(int x, int lower_bound, int upper_bound) 
{ 
    return x < lower_bound ? lower_bound : (upper_bound < x ? upper_bound : x); 
} 

, но если это шаблон, я вижу, что sample implementation, который, вероятно, что стандарт будет иметь использование const& «s, а не значений. Таким образом, делая вещи более простые для цитирования, что-то вроде:

template <typename T> 
constexpr T clip(const T& x, const T& lower_bound, const T& upper_bound) 
{ 
    return x < lower_bound ? lower_bound : (upper_bound < x ? upper_bound : x); 
} 

Моих вопросов:

  • Есть ли польза для принятия константной ссылки, для T-х, которые являются простыми числовыми типами?
  • То же, для типов, которые являются абстрактной вещью, обертывающей одно число в качестве элемента данных (например, std::chrono)?
  • Почему это (и это вообще) лучше взять const&, а затем значение в общем случае любой относительно простой, (constexpr?), Свободной от побочных эффектов математической функции?

Примечание:

  • Я понимаю, принимая const& могу начать иметь смысл, когда у вас есть, скажем, какое-то к-мерные векторный типа, или boost::rational с и другими числовыми подобными типами; но даже тогда, не будет ли компилятор оптимизировать копирование?
+0

Они не могут быть _простыми числовыми типами_. Они могут быть типами, которые ведут себя как числа. Вы могли бы не копировать их в конце концов. Более того, ссылка на const ссылается на временную, а иногда и на полезную. – skypjack

+0

'std :: complex' может быть фактическим примером типа в стандарте C++, для которого' const T & 'будет лучше, чем просто' T'. – Zereges

+0

@ Zereges: Опять же, почему? Разве компилятор не оптимизировал бы разницу? – einpoklum

ответ

3
  • Есть ли польза для принятия константной ссылки, для T-х, которые являются простыми числовыми типами?

Номер

  • То же, для типов, которые являются некоторые абстрактные вещи оберточной единственное число в качестве элемента данных (например, длительность std::chrono)?

No.

  • Почему это (и это вообще), лучше взять const&, чем значение в общем случае любой относительно непростого, (constexpr ?), математическая функция без побочных эффектов?

Представьте себе тип bigint, который использует динамическое распределение; копирование такого типа дорого.

  • Не будет ли компилятор оптимизировать копирование далеко?

Только если он может доказать, что копирование значения не имеют побочных эффектов, которые трудно делать, если весь код участвует не видна компилятором. (Итак, если ваш bigint использует, скажем, GMP, вам не повезло.)

2

Есть ли польза для принятия константной ссылки, для T-х, которые являются простыми числовыми типами?

Нет, я так не думаю, но нет никаких штрафов.

Ditto, для типов, которые являются абстрактной вещью, обертывающей единственное число в качестве элемента данных (например, std::chrono duration)?

То же.

Почему это (и это вообще) лучше взять const&, а затем значение в общем случае?

Стандартные библиотечные алгоритмы разработаны не только для основных типов, но и для пользовательских типов, которые не могут быть дешевыми для копирования. Для этих типов использование const& позволяет избежать штрафов за копирование, не нанося вреда обычным для основных типов.

+0

Но действительно ли существует штраф, с тривиальной оптимизацией компилятора? См. Мою первую заметку. – einpoklum

+0

Я обновлял ответ во время написания комментария. –

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

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