¿Por qué sizeof se llama operador de tiempo de compilación?

12

Originalmente, esto es parte de otra pregunta.

¿Por qué se sizeofllama operador de tiempo de compilación? ¿No es realmente un operador de tiempo de ejecución? Y si de hecho es un operador de tiempo de compilación, ¿cómo ayuda a producir código portátil que se ejecute igual en diferentes computadoras? Por favor explique en detalle.

El codificador pacífico
fuente
44
respondido en detalles en SO: ¿Por qué sizeof (x ++) no incrementa x?
mosquito
3
¿Cómo espera que cambie el tamaño de un tipo en tiempo de ejecución?
@MichaelT: El tamaño de una instancia de un tipo ciertamente puede cambiar: después de todo, hay un polimorfismo de clase. Yo diría que sizeof(polymorphic_ptr*)ser constante es bastante contra-intuitivo y simplemente tonto. Sí, es la forma de C ++, pero no obstante tonto.
Vuelva a instalar Mónica
@KubaOber De hecho. Tengo curiosidad por saber cómo OP pensó que debería comportarse en diferentes casos y espero obtener algún código que demuestre su confusión sobre esto para ayudar a expandir la pregunta.
44
Llegó a votar la respuesta "porque funciona en tiempo de compilación", se fue decepcionado.
Ben Jackson

Respuestas:

23

sizeof()le da el tamaño del tipo de datos , no el tamaño de una instancia particular de ese tipo en la memoria.

Por ejemplo, si tenía un objeto de datos de cadena que asignaba una matriz de caracteres de tamaño variable en tiempo de ejecución, sizeof()no podría usarse para determinar el tamaño de esa matriz de caracteres. Solo le daría el tamaño del puntero.

El tamaño de un tipo de datos siempre se conoce en tiempo de compilación.


fuente
3
Debido a que C (++) no tiene metadatos de objeto en tiempo de ejecución, tampoco puede obtener esas cosas en tiempo de ejecución.
C. Ross
55
En realidad, si se utiliza sizeofen una matriz, que va obtener el tamaño de la matriz (que es el tiempo el tamaño del elemento el número de elementos). Pero si lo usa en un puntero, solo obtendrá el tamaño del puntero. Entonces, dado que en la mayoría de los casos en los que le gustaría saber el tamaño de una matriz, solo tiene un puntero, no es tan útil.
sepp2k
1
@Jens La pregunta está etiquetada [C ++] y VLA no llegó al estándar C ++.
authchir
13

porque todo el tamaño de "llamada" se calcula en tiempo de compilación y lo que sea que esté entre paréntesis se descarta y no se ejecuta en tiempo de ejecución,

el resultado se basa únicamente en información de tipo estático disponible para el compilador

monstruo de trinquete
fuente
7

¿Por qué sizeof se llama operador de tiempo de compilación?

Porque, en tiempo de compilación, el compilador calcula el tamaño de la expresión y sustituye ese valor constante en tiempo de compilación.

¿No es realmente un operador de tiempo de ejecución?

No. Incluso puede usar sizeofpara evaluar el tamaño de las expresiones que no puede ejecutar legalmente (es decir, que incurriría en un Comportamiento indefinido), siempre que el compilador pueda determinar cuál es el tipo de expresión.

Además, incluso antes de C ++ 11 constexpr, puede usar sizeofexpresiones de formas que no puede usar expresiones en tiempo de ejecución.

Y si de hecho es un operador en tiempo de compilación, ¿cómo ayuda a producir código portátil ...

Los tipos pueden variar en tamaño en diferentes plataformas. El uso de sizeofexpresiones en lugar de suposiciones codificadas significa que su código no se romperá cuando compile en una plataforma diferente y sus tipos cambien de tamaño.

Inútil
fuente
1
Bueno, creo que esta es la respuesta más útil;). Hermano (suponiendo que seas hombre), tengo una duda. ¿Quiere decir que cuando la gente dice que sizeof hace que los programas sean portátiles, significa que el código fuente puede compilarse sin errores en todas las máquinas y no significa que el programa ejecutable pueda ejecutarse en cualquier máquina? Derecho ? Si esto es correcto, mi duda se aclara realmente.
The Peaceful Coder
1
Sí, el código es portátil, en el sentido de que puedes compilar un binario correcto (diferente) para cada plataforma.
Inútil
5

C ++ en realidad no almacena los metadatos de los objetos en tiempo de ejecución, por lo que la comprobación del tamaño debe ser tiempo de compilación. Para ver un ejemplo de cómo C ++ no valida el tamaño, declare una matriz intde algún tamaño arbitrario y lea más allá del final. Si tienes suerte, obtendrás una, segfaultpero es más probable que simplemente leas galimatías, porque C ++ no rastrea el tamaño de tu matriz.

Consulte ¿Puede un error de seg del programa C / C ++ leer más allá del final de una matriz (UNIX)? para un ejemplo de SO.

Cruzar
fuente