c++ - una - ¿Diferencia entre sizeof(estructura vacía) y sizeof(struct con matriz vacía)?
sizeof c++ (2)
En C, el comportamiento de un programa no está definido si una estructura se define sin ningún miembro con nombre.
C11-§6.7.2.1:
Si struct-declaration-list no contiene ningún miembro con nombre, ya sea directamente o a través de una estructura anónima o unión anónima, el comportamiento no está definido.
GCC permite una estructura vacía como extensión y su tamaño será 0
.
Para C ++, el estándar no permite un objeto de tamaño 0
y, por sizof(EmptyStruct)
tanto, sizof(EmptyStruct)
devuelve un valor de 1.
Las matrices de longitud cero no son compatibles con C ++ ¹ estándar, pero GNU las admite como una extensión y el operador sizeof
devolverá 0
si se aplica.
1. § 8.5.1-nota al pie 107) C ++ no tiene matrices de longitud cero.
Tengo dos estructuras definidas de la siguiente manera:
struct EmptyStruct{
};
struct StructEmptyArr{
int arr[0];
};
int main(void){
printf("sizeof(EmptyStruct) = %ld/n", sizeof(EmptyStruct));
printf("sizeof(StructEmptyArr) = %ld/n", sizeof(StructEmptyArr));
return 0;
}
Compilado con gcc (g ++) 4.8.4 en Ubuntu 14.04, x64.
Salida (para ambos gcc y g ++):
sizeof(EmptyStruct) = 1
sizeof(StructEmptyArr) = 0
Puedo entender por qué sizeof(EmptyStruct)
es igual a 1
pero no puede entender por qué sizeof(StructEmptyArr)
es igual a 0
. ¿Por qué hay diferencias entre dos?
https://gcc.gnu.org/onlinedocs/gcc/Empty-Structures.html
G ++ trata las estructuras vacías como si tuvieran un solo miembro de tipo char.
https://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html
Las matrices de longitud cero están permitidas en GNU C. Son muy útiles como el último elemento de una estructura que realmente es un encabezado para un objeto de longitud variable.