La mayoría de los compiladores de C++ eligieron generar un error de compilación al intentar obtener sizeof(void)
.
Al compilar C, gcc no se ajusta y eligió definir sizeof(void)
como 1. Puede parecer extraño, pero tiene un fundamento. Cuando se realiza una aritmética de puntero, agregar o eliminar una unidad significa agregar o eliminar el objeto que apunta al tamaño. Por lo tanto, la definición de sizeof(void)
como 1 ayuda a definir void*
como un puntero a byte (dirección de memoria sin tipo). De lo contrario, tendría comportamientos sorprendentes utilizando la aritmética del puntero como p+1 == p when
p es void*
. Tal aritmética de puntero en punteros vacíos no está permitida en C++, pero funciona bien al compilar C con gcc.
La manera estándar recomendada sería usar char*
para ese tipo de propósito (puntero a byte).
Otra diferencia similar entre C y C++ al utilizar sizeof se produce cuando se definió una estructura vacía como:
struct Empty {
} empty;
con gcc como mi compilador de C sizeof(empty)
vuelve 0. Con 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 esas dos referencias a diferentes objetos consecutivos, siendo el primero vacío, obtener la misma dirección. Si la referencia se implementa utilizando punteros ocultos como se hace a menudo, garantizar una dirección diferente ayudará a compararlos.
Pero esto es simplemente evitar un comportamiento sorprendente (comparación de casos de esquina de las referencias) mediante la introducción de otro (objetos vacíos, incluso los POD consumen al menos 1 byte de memoria).
FYI. Esto no es estándar C. En muchos compiladores, esto sería un error en tiempo de compilación. –
¿por qué necesita saberlo? Comprender esto puede ayudarnos a responder la pregunta. –
Comentando su edición: sí, en GCC (solamente), al incrementar un puntero de vacío se agrega uno al valor. Si valora la portabilidad de su código, no abuse de la libertad que GCC le brinda. Es completamente no estándar. Y GCC admite tanto con '-std = c99 -pedantic'. –