Originalmente, esto es parte de otra pregunta.
¿Por qué se sizeof
llama 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.
sizeof(polymorphic_ptr*)
ser constante es bastante contra-intuitivo y simplemente tonto. Sí, es la forma de C ++, pero no obstante tonto.Respuestas:
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
sizeof
en 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.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
fuente
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. Incluso puede usar
sizeof
para 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 usarsizeof
expresiones de formas que no puede usar expresiones en tiempo de ejecución.Los tipos pueden variar en tamaño en diferentes plataformas. El uso de
sizeof
expresiones 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.fuente
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
int
de algún tamaño arbitrario y lea más allá del final. Si tienes suerte, obtendrás una,segfault
pero 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.
fuente