Разница между std:: pair и std:: tuple с двумя членами?
Есть ли разница между std::pair
и std::tuple
только с двумя членами? (Помимо очевидного, что std::pair
требуется два и только два члена, а у tuple
может быть больше или меньше...)
Ответы
Ответ 1
Есть некоторые различия:
std::tuple
никогда не может быть по стандартному макету (по крайней мере, по стандарту это не обязательно). Каждый std::pair<T, Y>
является стандартным макетом, если оба T
и Y
являются стандартным макетом.
Немного легче получить содержимое pair
, чем tuple
. Вы должны использовать вызов функции в случае tuple
, в то время как дело pair
- просто поле члена.
Но это об этом.
Ответ 2
Это очень поздний ответ, но обратите внимание, что, поскольку std::pair
определяется переменными-членами, его размер не может быть оптимизирован с помощью пустая оптимизация базового класса (first
и second
должны занимать разные адреса, даже если один или оба являются пустым классом). Это усугубляется любыми требованиями к выравниванию second_type
, поэтому в худшем случае результирующий std::pair
будет в основном в два раза больше, чем он должен быть.
std::tuple
разрешает доступ только через вспомогательные функции, поэтому он может быть получен из любого типа, если тот или иной пуст, сохраняя накладные расходы. Реализация GCC, по крайней мере, определенно делает это... вы можете пробивать заголовки, чтобы проверить это, но там также this в качестве доказательства.
Ответ 3
Имя std::tuple
длиннее (один дополнительный символ). Больше этих символов набирается с правой стороны, поэтому для большинства людей это проще.
Тем не менее, std::pair
может иметь только два значения - не ноль, один, три или более. ДВЕ значения. Однако кортеж почти не имеет смыслового ограничения на количество значений. Таким образом, std::pair
является более точным, безопасным типом типа, если вы действительно хотите указать пару значений.
Ответ 4
Для чего это стоит, я считаю, что вывод GDB для std:: tuple гораздо труднее прочитать. Очевидно, если вам нужно больше двух значений, то std:: pair не будет работать, но я считаю это точкой в пользу структур.
Ответ 5
Обратите внимание, что с C++ 17 можно использовать один и тот же интерфейс для чтения данных из пары и кортежа с двумя элементами.
auto [a, b] = FunctionToReturnPairOrTuple();
Не нужно использовать get<>
:)