¿Inicialización global y variable estática a 0 siempre es innecesaria?

El estándar C garantiza que las variables globales y estáticas, si no se inicializan, siempre son 0 .

Aquí está mi pregunta: las variables globales y estáticas no inicializadas van al segmento BSS en el progtwig. Así que el llamado 0 debería ser all-bit 0 .

Para las variables integrales, all-bit 0 se evaluará como 0 . Las variables de punto flotante, si siguen IEEE 754 , también son 0.0 . Pero para los punteros, los punteros nulos no necesariamente tienen que ser all-bit 0 , así como la inicialización de un puntero global como este:

 int* p = NULL; 

hacer cualquier diferencia a solo:

 int *p; 

El estándar garantiza que un puntero con duración de almacenamiento estático y ningún otro inicializador se inicializará para ser un puntero nulo, independientemente del patrón de bits que pueda implicar.

La misma idea básica se aplica también a los tipos de coma flotante y enteros: se garantiza que también se inicialicen a 0 o 0.0. La implementación puede dejar esto en el hecho de que BSS establece todos los bits en 0 si, y solo si “sabe”, al hacerlo se obtendrán los valores correctos.

Se garantiza que todas las variables con duración de almacenamiento estático se inhabilitarán a sus respectivos valores de cero, lo que generalmente no significa que tengan que rellenarse físicamente con el patrón de todos los bits a cero.

La razón por la que dichas variables pueden ir al segmento BSS en alguna plataforma específica es que en la plataforma de destino el puntero nulo está representado por un patrón de todos los bits cero. Es decir, la inicialización de todos los bits y cero para los punteros funciona correctamente en esa plataforma, por lo que el comstackdor utiliza BSS como la forma más simple y eficiente de implementar el comportamiento correcto en esa plataforma específica. Si ese no fuera el caso, el comstackdor tendría que inicializar dichas variables estáticas de manera diferente.

Eso se aplicaría a los valores de punto flotante, por ejemplo, si alguna plataforma utilizara una representación no IEEE 754 para dichos valores con un patrón de bits distinto de cero para representar 0.0 (C no exige IEEE 754).

(Además, esto incluso solía aplicarse a todos los tipos integrales más grandes que char , hasta que uno de los TC para el estándar C99 finalmente requería que el patrón de todos los bits a cero fuera una representación de objeto válida para ceros enteros de todos los tipos en todas las plataformas C).

Un buen ejemplo de la vida real proviene de C ++ (un lenguaje diferente pero relevante en este caso). C ++ ofrece la misma garantía para las variables escalares con duración de almacenamiento estático. Mientras tanto, muchas implementaciones populares de C ++ utilizan el valor 0xFFFFFFFF para representar punteros nulos de tipo puntero a datos. P.ej

 SomeType SomeClass::*p = 0; 

en realidad se traduce en un código que llena p con un patrón de todos los bits y uno. Entonces, si declara una variable estática de ese tipo sin un inicializador explícito, el comstackdor tendrá que asegurarse de que su valor inicial sea un patrón de todos los bits-uno, no un patrón de todos los bits-cero. Se sabe que algunos comstackdores se equivocan al poner tales variables en el BSS se están olvidando de ellas, por lo que dejan tales variables llenas con el patrón de todos los bits cero.