Vra

Is globale geheue geïnisialiseer in C++?En indien wel, hoe?

(Tweede) verduideliking:

Wanneer 'n program begin, wat is in die geheuespasie wat globale geheue sal word, voordat primitiewe geïnisialiseer word?Ek probeer verstaan ​​of dit uitgeskakel is, of byvoorbeeld vullis.

Die situasie is:kan 'n enkeltonverwysing gestel word - via 'n instance() oproep, voor die inisialisering daarvan:

MySingleton* MySingleton::_instance = NULL;

en kry twee enkeltongevalle as gevolg daarvan?

Sien my C++-vasvra oor verskeie gevalle van 'n singleton ...

Was dit nuttig?

Oplossing

Ja globale primitiewe is geïnisialiseer na NULL.

Voorbeeld:

int x;

int main(int argc, char**argv)
{
  assert(x == 0);
  int y;
  //assert(y == 0); <-- wrong can't assume this.
}

Jy kan geen aannames maak oor klasse, strukture, skikkings, blokke geheue op die hoop nie...

Dit is die veiligste om net altyd alles te inisialiseer.

Ander wenke

Van die standaard:

Voorwerpe met statiese bergingsduur (3.7.1) moet nul-geïnisialiseer word (8.5) voordat enige ander inisialisering plaasvind.Zero-initialisasie en inisialisering met 'n konstante uitdrukking word gesamentlik genoem statiese inisialisering;alle ander inisialisering is dinamiese inisialisering.Voorwerpe van POD [gewone ou data] tipes (3.9) met statiese bergingsduur geïnisialiseer met konstante uitdrukkings (5.19) sal geïnisialiseer word voordat enige dinamiese inisialisering plaasvind.Voorwerpe met statiese stoortydperk wat in naamruimteomvang in dieselfde vertaaleenheid gedefinieer is en dinamies geïnisialiseer word, sal geïnisialiseer word in die volgorde waarin hul definisie in die vertaaleenheid verskyn.[Let wel:8.5.1 beskryf die volgorde waarin totale lede geïnisialiseer word.Die aanvanklike izasie van plaaslike statiese voorwerpe word in 6.7 beskryf.

So ja, globales wat statiese bergingsduur het, sal geïnisialiseer word.Globale wat byvoorbeeld op die hoop toegewys is, sal natuurlik nie outomaties geïnisialiseer word nie.

Kom uit die ingebedde wêreld...

Jou kode word saamgestel in drie tipes geheue:
1..data:geïnisialiseerde geheue
2..teks:konstantes en kode
3..bss:ongeïnisialiseerde geheue (geïnisialiseer na 0 in C++ indien nie eksplisiet geïnisialiseer nie)

Globale gaan in .data indien geïnisialiseer.Indien nie, word hulle in .bss geplaas en in die premain-kode nulgestel.

Veranderlikes wat met statiese/globale omvang verklaar word, word ten minste altyd onder VC++ geïnisialiseer.

Onder sekere omstandighede kan daar eintlik 'n verskil in gedrag wees tussen:

int x = 0;

int main() { ... }

en

int x;

int main() { ... }

As jy gedeelde datasegmente gebruik, gebruik VC++ ten minste die teenwoordigheid van 'n eksplisiete inisialisering saam met 'n #pragma data_seg om te bepaal of 'n bepaalde veranderlike in die gedeelde datasegment of die private datasegment vir 'n proses moet gaan.

Vir ekstra pret, oorweeg wat gebeur as jy 'n statiese C++-objek het met konstruktor/destruktor wat in 'n gedeelde datasegment verklaar is.Die konstruktor/vernietiger word elke keer as die exe/dll aan die datasegment geheg word, genoem, wat byna seker nie is wat jy wil hê nie.

Meer besonderhede hierin KB artikel

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top