c++ - una - ¿Por qué las variables globales y estáticas se inicializan a sus valores predeterminados?
variables externas c (5)
En C, los objetos asignados estáticamente sin un inicializador explícito se inicializan a cero (para tipos aritméticos) o un puntero nulo (para tipos de puntero). Las implementaciones de C normalmente representan valores cero y valores de puntero nulos usando un patrón de bits que consiste únicamente en bits de valor cero (aunque esto no es requerido por el estándar C). Por lo tanto, la sección bss generalmente incluye todas las variables no inicializadas declaradas en el alcance del archivo (es decir, fuera de cualquier función), así como las variables locales no inicializadas declaradas con la palabra clave estática.
Fuente: Wikipedia
En C / C ++, ¿por qué las variables globales y estáticas se inicializan a los valores predeterminados?
¿Por qué no dejarlo solo con los valores de basura? ¿Hay alguna razón especial para esto?
Seguridad : al dejar solo la memoria, se filtraría información de otros procesos o del kernel.
Eficiencia : los valores son inútiles hasta que se inicialicen en algo, y es más eficiente ponerlos en cero en un bloque con bucles desenrollados. El sistema operativo puede incluso cero páginas libres cuando el sistema está inactivo, en lugar de cuando algún cliente o usuario está esperando que el programa se inicie.
Reproducibilidad : dejar solo los valores haría que el comportamiento del programa no se repita, haciendo que los errores sean realmente difíciles de encontrar.
Elegancia : es más claro si los programas pueden comenzar desde 0 sin tener que saturar el código con inicializadores predeterminados.
Uno podría preguntarse por qué la clase de almacenamiento auto
comienza como basura. La respuesta es doble:
No lo hace, en cierto sentido. La primera página de marco de pila en cada nivel (es decir, cada página nueva agregada a la pila) no recibe valores cero. Los valores "basura" o "no inicializados" que ven las instancias de función subsiguientes en el mismo nivel de pila son realmente los valores anteriores que dejaron otras instancias de método de su propio programa y su biblioteca.
Puede haber una penalización de rendimiento en tiempo de ejecución cuadrática (o lo que sea) asociada con la inicialización
auto
(locales de función) a cualquier cosa. Una función puede no usar ninguna o toda una matriz grande, por ejemplo, en una llamada determinada, y podría invocarse miles o millones de veces. La inicialización de estáticos y globales, OTOH, solo tiene que suceder una vez.
Debido a que con la cooperación adecuada del sistema operativo, se pueden implementar 0 statics y globales de inicialización sin sobrecarga de tiempo de ejecución.
La sección 6.7.8 Inicialización del estándar C99 (n1256) responde a esta pregunta:
Si un objeto que tiene una duración de almacenamiento automática no se inicializa explícitamente, su valor es indeterminado. Si un objeto que tiene una duración de almacenamiento estática no se inicializa explícitamente, entonces:
- si tiene tipo de puntero, se inicializa a un puntero nulo;
- si tiene tipo aritmético, se inicializa a cero (positivo o sin signo);
- si es un agregado, cada miembro se inicializa (recursivamente) de acuerdo con estas reglas;
- si es una unión, el primer miembro nombrado se inicializa (recursivamente) de acuerdo con estas reglas.
Piénselo, en el ámbito estático no se puede decir siempre con certeza que algo se inicializó o que el elemento principal ha comenzado. También hay un inicio estático y una fase de inicio dinámico, el estático uno primero justo después del dinámico, donde el orden importa.
Si no tiene cero a partir de estática, entonces sería completamente incapaz de decir en esta fase con seguridad si se inicializó algo EN SU TOTALIDAD y en resumen, el mundo C ++ se desintegraría y cosas básicas como singletons (o cualquier tipo de dinámica estática) init) simplemente dejaría de funcionar.
La respuesta con los puntos de viñeta es entusiasta pero un poco tonta. Esos podrían aplicarse a la asignación no estática, pero eso no se hace (bueno, a veces, pero no por lo general).