c++ visual-studio-2010 std-pair

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:

  1. std::tuple nunca puede ser por standard-layout (al menos, no es obligatorio que sea según el estándar). Cada estándar std::pair<T, Y> es diseño estándar si tanto T como Y son diseño estándar.

  2. Es un poco más fácil obtener el contenido de un pair que una tuple . Debe usar una llamada de función en el caso de tuple , mientras que el caso de pair 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.