c++ - compiler - ¿Cómo puede std:: unique_ptr no tener una sobrecarga de tamaño?
c++14 (2)
La razón es que el typename _Dp = default_delete<_Tp>
es una clase vacía y la plantilla de tuple
emplea una optimización de clase base vacía.
Si unique_ptr
una instancia de unique_ptr
con una eliminación no predeterminada, debería ver el aumento de tamaño.
Si el tamaño de una clase vacía no puede ser 0, ¿qué magia está haciendo std :: tuple para que el tamaño de unique_ptr regrese 8 en una máquina de 64 bits?
En unique_ptr, el miembro se define como:
typedef std::tuple<typename _Pointer::type, _Dp> __tuple_type;
__tuple_type _M_t;
Donde _Dp es la clase de eliminación.
El compilador es la versión 4.7.1 de gcc (Debian 4.7.1-7)
unique_ptr
como se especifica puede tener cero sobrecarga porque lo único que se necesita para implementarlo es modificar el proceso de copiar / mover un puntero sin procesar; no se necesita información adicional. Por unique_ptr
tanto, unique_ptr
no necesita almacenar nada además del puntero y puede tener el mismo tamaño que un puntero.
En cuanto a cómo su implementación particular, logra eso; Solo la mayoría de los tipos derivados necesitan tener un tamaño mayor que cero. Las clases base vacías pueden ocupar cero bytes. Es bastante común que las implementaciones de bibliotecas estándar aprovechen la denominada optimización de la "clase base vacía" para todo tipo de cosas, desde asignadores sin estado en contenedores hasta tuplas.