Разница между std:: pair и std:: tuple с двумя членами? - программирование
Подтвердить что ты не робот

Разница между std:: pair и std:: tuple с двумя членами?

Есть ли разница между std::pair и std::tuple только с двумя членами? (Помимо очевидного, что std::pair требуется два и только два члена, а у tuple может быть больше или меньше...)

4b9b3361

Ответ 1

Есть некоторые различия:

  1. std::tuple никогда не может быть по стандартному макету (по крайней мере, по стандарту это не обязательно). Каждый std::pair<T, Y> является стандартным макетом, если оба T и Y являются стандартным макетом.

  2. Немного легче получить содержимое 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<> :)