La mayoría de los compiladores de C ++ optaron por generar un error de compilación al intentar obtener sizeof(void)
.
Al compilar C, gcc no se ajusta y eligió definirlo sizeof(void)
como 1. Puede parecer extraño, pero tiene una razón fundamental. Cuando hace aritmética de punteros, agregar o quitar una unidad significa agregar o quitar el objeto apuntado al tamaño. Por lo tanto, definir sizeof(void)
como 1 ayuda a definir void*
como un puntero a un byte (dirección de memoria sin escribir). De lo contrario, tendrías comportamientos sorprendentes usando aritmética de punteros como p+1 == p when
p void*
. Esta aritmética de punteros en punteros vacíos no está permitida en c ++ pero funciona bien cuando se compila C con gcc.
La forma estándar recomendada sería utilizar char*
para ese tipo de propósito (puntero a byte).
Otra diferencia similar entre C y C ++ cuando se usa sizeof ocurre cuando define una estructura vacía como:
struct Empty {
} empty;
Usar gcc como mi compilador de C sizeof(empty)
devuelve 0. Usar g ++ el mismo código devolverá 1.
No estoy seguro de qué establece los estándares C y C ++ en este punto, pero creo que definir el tamaño de algunas estructuras / objetos vacíos ayuda con la administración de referencias para evitar que dos referencias a objetos consecutivos diferentes, la primera vacía, obtengan el misma direccion. Si las referencias se implementan utilizando punteros ocultos como se hace a menudo, asegurarse de que haya direcciones diferentes ayudará a compararlos.
Pero esto es simplemente evitar un comportamiento sorprendente (comparación de casos de esquina de referencias) introduciendo otro (objetos vacíos, incluso los POD consumen al menos 1 byte de memoria).