c++ - Diferencia entre std:: pair y std:: tuple con solo dos miembros?
visual-studio-2010 std-pair (4)
El nombre de std::tuple
es más largo (un carácter adicional). Muchos de esos caracteres se escriben con la mano derecha, por lo que es más fácil para la mayoría de las personas escribir.
Dicho esto, std::pair
solo puede tener dos valores, no cero, uno, tres o más. DOS valores Una tupla, sin embargo, casi no tiene limitación semántica en el número de valores. Un std::pair
, por lo tanto, es un tipo más seguro y seguro para usar si realmente desea especificar un par de valores.
¿Hay alguna diferencia entre std::pair
y std::tuple
con solo dos miembros? (Además de lo obvio que std::pair
requiere dos y solo dos miembros y tuple
pueden tener menos ...)
Esta es una respuesta muy tardía, pero tenga en cuenta que, como std::pair
se define con variables miembro, su tamaño no se puede optimizar utilizando la optimización de clase base vacía ( first
y second
deben ocupar direcciones distintas, incluso si una o ambas son una clase vacía) . Esto se ve agravado por los requisitos de alineación que tenga second_type
, por lo que en el peor de los casos, el std::pair
resultante será básicamente el doble del tamaño que necesita.
std::tuple
solo permite el acceso a través de funciones auxiliares, por lo que es posible derivar de cualquier tipo si uno u otro está vacío, lo que permite ahorrar en la sobrecarga. La implementación de GCC, al menos, definitivamente hace esto ... puede hojear los encabezados para verificar esto, pero también hay this como evidencia.
Hay algunas diferencias:
std::tuple
nunca puede ser por standard-layout (al menos, no es obligatorio que sea según el estándar). Cada estándarstd::pair<T, Y>
es diseño estándar si tantoT
comoY
son diseño estándar.Es un poco más fácil obtener el contenido de un
pair
que unatuple
. Debe usar una llamada de función en el caso detuple
, mientras que el caso depair
solo es un campo de miembro.
Pero eso es todo.
Por lo que vale, creo que la salida de GDB de std :: tuple es mucho más difícil de leer. Obviamente, si necesita más de 2 valores, std :: pair no funcionará, pero considero que este es un punto a favor de las estructuras.