2008-10-03 12 views
1

Betrachten Sie diese zwei Köpfe Fälle ++ C:Beeinflusst die statische Array-Konsistenz das Layout der gemeinsam genutzten Bibliothek?

Fall 1:

class Test { 
    public: 
    static int TEST_DATA[]; 
}; 
int Test::TEST_DATA[] = { 1, 2, 3, 4 }; 

Fall 2:

class Test { 
    public: 
    static int const TEST_DATA[]; 
}; 
int const Test::TEST_DATA[] = { 1, 2, 3, 4 }; 

Ist const im letzteren Fall nur für selbst auferlegte Kompilierung-Kontrollen oder tut beeinflusst es das Shared-Library-Layout auf Mac/Linux/Windows?

Update: Nach den Antworten der Compiler kann setzen die konst Sachen auf einem Read-Only-Seite. Führt Visual C++ unter Windows oder GCC auf Mac oder Linux tatsächlich const Daten auf einer schreibgeschützten Seite? Vielleicht habe ich den falschen Weg getestet, aber bei Mac auf Intel schienen die Elemente der const-Version beschreibbar.

Antwort

2

Der Compiler kann die Daten in einen anderen Abschnitt der Binärdatei setzen, je nachdem, ob es const ist oder nicht - das liegt ausschließlich im Ermessen des Compilers.

0

Obwohl es keine Garantien gibt, ist es unwahrscheinlich, dass die const im Falle eines Arrays die Binärkompatibilität bricht, so dass gemeinsam genutzte Bibliotheken dasselbe Layout haben sollten.

Hinweis würde dies wahrscheinlich nicht der Fall für einen einzelnen int:

struct Test 
{ 
    static int const TEST; 
}; 
int const Test::TEST = 7; 

weil TEST ein Kompilierung-Konstante ist.

1

Der Compiler (oder eigentlich der Linker) könnte die zweite in ein als schreibgeschützt gekennzeichnetes Segment setzen, um eine Hardware-Ausnahme auszulösen, wenn Sie versucht haben, darauf zu schreiben. Da das Schreiben in Dinge, auf die nicht geschrieben werden soll, ein Vektor für Sicherheitsangriffe ist, sichern mehr Systeme ihre schreibgeschützten Daten.