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

13

Originalmente, esta es una parte de otra pregunta.

¿Por qué sizeof se llama operador de tiempo de compilación? ¿No es en realidad un operador de tiempo de ejecución? Y si de hecho es un operador de tiempo de compilación, ¿cómo ayuda en la producción de código portátil que funciona igual en diferentes computadoras? Por favor explique en detalle.

    
pregunta The Peaceful Coder 18.04.2013 - 19:04

4 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 se podría usar para determinar el tamaño de esa matriz de caracteres. Solo te daría el tamaño del puntero.

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

    
respondido por el user82096 18.04.2013 - 19:06
13

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

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

    
respondido por el ratchet freak 18.04.2013 - 19:40
7
  

¿Por qué se llama sizeof a un operador en 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 de tiempo de compilación.

  

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

No. Incluso puede usar sizeof para evaluar el tamaño de las expresiones que no puede ejecutar legalmente (es decir, que incurrirían en un comportamiento indefinido), siempre que el compilador pueda averiguar qué tipo de de la expresión es.

Además, incluso antes de C ++ 11 constexpr , puedes usar sizeof expresiones de manera que no puedas usar expresiones en tiempo de ejecución.

  

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

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

    
respondido por el Useless 19.04.2013 - 11:41
5

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

Consulte ¿Puede fallar un programa C / C ++ por falta de lectura después del final de una matriz (UNIX)? para un ejemplo de SO.

    
respondido por el C. Ross 18.04.2013 - 19:36

Lea otras preguntas en las etiquetas