mir ist aufgefallen, dass mit Null initialisierte Daten im
BSS-Segment abgelegt werden, welches eigentlich für
uninitalisierte Werte zuständig ist.
Folgender Test:
//test.cpp
//Compile with /c /FHsc
int Val0=0;
int Val1=1;
Im generierten ASM-Code liegt Val0 in _BSS und Val1 in _DATA!
Kann mir jemand den Unterschied zwischen 0 und 1 (bzw. einer
anderen Zahl) erklären? Oder ist das ein Bug, was ich aber nicht
glaube!
MfG
Andreas
Sinn und Zweck des BSS-Segmentes ist es nur, dass die EXE/DLL für diese
Daten im Image keinen Platz vorsehen muss. Alles was als global/static
declariert ist (oder mit 0 initialisiert wurde) macht die EXE/DLL nicht
größer.
Leider ist die Namensgebung für BSS entwas unschön geraten
(uninitialized data), da das segment sehr wohl initialisiert wird (aber
eben erst vom OS-Loader) und zwar mit 0.
Und leider gibt es darüber auch nicht eine so tolle Doku...
Aber als Anhaltspunkt dient: Initializing Scalar Types
http://msdn.microsoft.com/library/en-us/vccelng/htm/decla_29.asp
<quote>
If you do not explicitly initialize a global static variable, it is
initialized to 0 by default, and every member that has pointer type is
assigned a null pointer.
</quote>
Und siehe: Peering Inside the PE: A Tour of the Win32 Portable
Executable File Format
http://msdn.microsoft.com/library/en-us/dndebug/html/msdn_peeringpe.asp
<quote>
The .bss section is where any uninitialized static and global variables
are stored.
</quote>
Nimmt man die beiden Aussagen zusammen erkennt man, dass BSS mit 0
initialisiert wird.
Beachte auch, dass das folgende Beispiel "Val" und "Val0" in BSS
plaziert:
int Val;
int Val0 = 0;
int Val1 = 1;
--
Greetings
Jochen
My blog about Win32 and .NET
http://blog.kalmbachnet.de/
"Jochen Kalmbach" <nospam-Joch...@holzma.de> wrote:
> Leider ist die Namensgebung für BSS entwas unschön geraten
> (uninitialized data), da das segment sehr wohl initialisiert
> wird (aber
> eben erst vom OS-Loader) und zwar mit 0.
Also so wie ZERO_MEMORY bei den Alloc-Funktionen.
Also wird diese Optimierung nur gemacht, damit man in den PEs
Nullen spart? Macht allerdings den ASM-Code nicht unbedingt
klarer ;-)
MfG
Andreas