두 멤버 만있는 std :: pair와 std :: tuple의 차이점은 무엇입니까? an std::pair과 an 의 차이가 std::tuple있나요?

멤버가 두 명 뿐인 an std::pair과 an 의 차이가 std::tuple있나요? ( std::pair두 명만 필요하고 tuple더 많거나 적을 수 있는 명백한 것 외에도 …)



답변

몇 가지 차이점이 있습니다.

  1. std::tuple표준 레이아웃이 될 수 없습니다 (적어도 표준에 따라야필요 는 없습니다 ). 모든는 std::pair<T, Y>두 경우 표준 레이아웃입니다 TY표준 레이아웃입니다.

  2. 의 내용을 가져 오는 pair것이 tuple. 케이스는 단지 멤버 필드 tuple일 때 함수 호출을 사용해야 pair합니다.

하지만 그게 다입니다.


답변

이것은 매우 늦게 대답 때문이 아니라, 참고 인 std::pair멤버 변수로 정의되고, 그 크기는 사용하여 최적화 할 수없는 빈 기본 클래스 최적화를 ( first그리고 second하나 또는 둘 모두가 빈 클래스 인 경우에도 서로 다른 주소를 차지해야합니다). 이는 정렬 요구 사항 second_type이 무엇이든간에 악화 되었으므로 최악의 경우 결과 std::pair는 기본적으로 필요한 크기의 두 배가 될 것입니다.

std::tuple도우미 함수를 통해서만 액세스 할 수 있으므로 둘 중 하나가 비어있는 경우 두 유형에서 파생되어 오버 헤드를 절약 할 수 있습니다. 적어도 GCC의 구현, 확실히이 작업을 수행합니다 … 당신이 이것을 확인하기 위해 헤더를 통해 찌를뿐만 아니라 거기에 수 증거로.


답변

std::tuple의 이름은 이상 (한 여분의 문자)입니다. 더 많은 문자가 오른손으로 입력되므로 대부분의 사람들이 입력하기가 더 쉽습니다.

즉, std::pair0, 1, 3 또는 그 이상이 아닌 두 개의 값만 가질 수 있습니다. 두 가지 값. 그러나 튜플에는 값 수에 대한 의미 적 제한이 거의 없습니다. 은 std::pair, 그러므로, 당신이 실제로 값의 쌍을 지정하려는 경우에 사용하는보다 정확한 입력 안전 유형입니다.


답변

C ++ 17에서는 동일한 인터페이스를 사용하여 두 요소가있는 쌍과 튜플 모두에서 데이터를 읽을 수 있습니다.

auto [a, b] = FunctionToReturnPairOrTuple();

사용할 필요가 없습니다 get<>🙂


답변

그만한 가치는 std :: tuple의 GDB 출력이 읽기가 훨씬 더 어렵다는 것을 알았습니다. 분명히 두 개 이상의 값이 필요하면 std :: pair가 작동하지 않지만 구조체에 유리한 점이라고 생각합니다.