Implizite interne Verknüpfung nicht identisch mit expliziter interner Verknüpfung ("statisch")?

8

Heute bin ich auf eine Besonderheit gestoßen, die, obwohl wahrscheinlich nicht wirklich wichtig, mich doch verwirrt. Vielleicht verstehe ich C ++ auch nicht richtig.

Einige Arrays in einer Quelldatei verweisen auf String-Literale, etwa so:

%Vor%

Keines dieser Zeigerarrays wird jemals anders verwendet, als an GetProcAddress übergeben zu werden, um einen Funktionszeiger aus einer Bibliothek abzurufen (dies ist ein nicht blockierender dynamischer OpenAL / EFX / Capture-Funktionslader und Kontext-Ersteller / Manager) ).

Es kam mir schließlich in den Sinn, dass ich diese Variablen wahrscheinlich als static const deklarieren sollte, da sie außerhalb dieser .cpp-Datei nicht benötigt werden, sodass die interne Verknüpfung explizit erscheint. Sie sollten sowieso eine interne Verbindung haben (ISO14882 3.5 (3)), also sind wir nur gute Bürger, indem wir explizit machen, was der Compiler bereits annimmt.

Durch diese unschuldige Änderung wurde die Größe der ausführbaren Datei um 512 Byte erhöht. Nicht wie eine zusätzliche 512b wirklich wichtig, aber es schien einfach keinen Sinn zu machen, dass die gleiche Sache in anderen Code führen würde. Da static const veraltet ist (ISO14882 7.3.1.1 (2)), habe ich auch einen anonymen Namespace mit dem gleichen Ergebnis versucht.

Beim Betrachten der Assembler-Quelle wird angezeigt, dass die explizite interne Verknüpfung ( static oder namespace{} ) die String-Literale in .rdata anstatt in .data verschiebt und die String-Literale mit pointer-to-string- verschachtelt werden. literale Arrays, anstatt alle Zeichenfolgen und alle Zeiger in einem Block zu haben. Hierin liegt wahrscheinlich auch der Grund für die unterschiedliche Größe - sehr wahrscheinlich, dass Daten von einem Abschnitt zum anderen gemischt werden, hat eine Abschnittsgrößenbeschränkung erreicht. Interessanterweise verfärben alle 3 Geschmacksrichtungen die Namen auch anders.

Nun frage ich mich: Mache ich einen Trugschluss, sollten diese Zeiger nicht interne Verbindungen haben?

Außerdem ist const nach meinem Verständnis bereits schreibgeschützt, und in vielen Fällen ist static const "schreibgeschützter" (einer geht in .rdata und der andere nicht)?

    
Damon 30.06.2011, 14:14
quelle

1 Antwort

7

Ihre Arrays sind nicht deklariert const , daher sind sie auch nicht implizit interne Verknüpfungen. Was Sie haben, ist nicht-const arrays von pointer-to-const.

Das heißt, ich weiß nicht, warum dies Auswirkungen darauf hat, ob die Strings in .rdata oder .data enden.

    
Steve Jessop 30.06.2011, 14:34
quelle

Tags und Links