[C++] Inline Variables

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
Benutzeravatar
Krishty
Establishment
Beiträge: 8229
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

[C++] Inline Variables

Beitrag von Krishty »

Ich habe eben das Proposal zu Inline Variables gelesen: http://www.open-std.org/jtc1/sc22/wg21/ ... 0386r2.pdf

inline-Variablen werden demnach wie inline-Funktionen behandelt – gibt es mehrere Definitionen, tut der Linker so, als wäre nur eine vorhanden.

Gehe ich recht in der Annahme, dass das ein standardkonformer Weg sein wird, __declspec(selectany) und __attribute__((weak)) zu ersetzen? Ohne diese dürfen Compiler ja eigentlich keine identischen Instanzen zusammenfassen, weil der Standard garantiert, dass zwei Instanzen unterschiedliche Adressen haben.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
dot
Establishment
Beiträge: 1734
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: [C++] Inline Variables

Beitrag von dot »

Am ehesten noch __declspec(selectany) würde ich sagen. wobei das imo auch nicht ganz das gleiche ist. Und Weak Linkage ist dann aber doch was grundlegend anderes...
DerAlbi
Establishment
Beiträge: 269
Registriert: 20.05.2011, 05:37

Re: [C++] Inline Variables

Beitrag von DerAlbi »

Die Konstruktoraufruf-Abfolge ist mit inline-Variablen aber immer noch unklar. Das stinkt zum Himmel.
Benutzeravatar
Krishty
Establishment
Beiträge: 8229
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: [C++] Inline Variables

Beitrag von Krishty »

dot hat geschrieben:Am ehesten noch __declspec(selectany) würde ich sagen. wobei das imo auch nicht ganz das gleiche ist.
Warum nicht?
Proposal hat geschrieben:A variable declared inline has the same semantics as a function declared inline: it can be defined, identically, in multiple translation units, must be defined in every translation unit in which it is odr­used, and the behavior of the program is as if there is exactly one variable.
https://docs.microsoft.com/en-us/cpp/cpp/selectany hat geschrieben:A global data item can normally be initialized only once in an EXE or DLL project. selectany can be used in initializing global data defined by headers, when the same header appears in more than one source file.

At link time, if multiple definitions of a COMDAT are seen, the linker picks one and discards the rest.
Klingt für mich ziemlich identisch …
Und Weak Linkage ist dann aber doch was grundlegend anderes...
Hmm … inwiefern? Ist GCC nicht so spezifiziert, dass Variablen mit __attrubute__((weak)) mehrfach definiert werden können, und sich GCC dann für eine Definition entscheidet und den Rest verwirft (AFAIK die größte Definition, um leere Definitionen zu ignorieren)?
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
dot
Establishment
Beiträge: 1734
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: [C++] Inline Variables

Beitrag von dot »

Krishty hat geschrieben:
dot hat geschrieben:Am ehesten noch __declspec(selectany) würde ich sagen. wobei das imo auch nicht ganz das gleiche ist.
Warum nicht?
Proposal hat geschrieben:A variable declared inline has the same semantics as a function declared inline: it can be defined, identically, in multiple translation units, must be defined in every translation unit in which it is odr­used, and the behavior of the program is as if there is exactly one variable.
https://docs.microsoft.com/en-us/cpp/cpp/selectany hat geschrieben:A global data item can normally be initialized only once in an EXE or DLL project. selectany can be used in initializing global data defined by headers, when the same header appears in more than one source file.

At link time, if multiple definitions of a COMDAT are seen, the linker picks one and discards the rest.
Klingt für mich ziemlich identisch …
inline verlangt dass die verschiedenen Definitionen identisch sein müssen, selectany tut das nicht (inline verlangt zwar keine Diagnostik und der Nutzen von selectany mit verschiedenen Definitionen sei mal dahingestellt; zwischen dem klar definierten Verhalten von "der Linker nimmt irgendeine der gegebenen Möglichkeiten" und "undefined behavior" gibt's imo aber dennoch einen wichtigen semantischen Unterschied).
Krishty hat geschrieben:
Und Weak Linkage ist dann aber doch was grundlegend anderes...
Hmm … inwiefern? Ist GCC nicht so spezifiziert, dass Variablen mit __attrubute__((weak)) mehrfach definiert werden können, und sich GCC dann für eine Definition entscheidet und den Rest verwirft (AFAIK die größte Definition, um leere Definitionen zu ignorieren)?
Der primäre Sinn von weak Linkage ist meinem Verständnis nach nicht wirklich Mehrfachdefinitionen zu erlauben, sondern vielmehr um die Möglichkeit einer default Definition für ein Symbol zu haben, welche von einer Definition mit strong Linkage ersetzt werden kann (Paradebeispiel: operator new() hat eine Standardimplementierung die aber vom Benutzer ersetzt werden kann). Abgesehen davon hat weak Linkage – im Gegensatz zu inline – ebenfalls ein klar definiertes Verhalten im Falle von verschiedenen Definitionen...

In Summary: inline, __declspec(selectany) und __attribute__((weak)) tun alle drei imho verschiedene Dinge die sich semantisch zwar vielleicht überlappen aber keine der jeweiligen Semantiken wäre eine echte Teilmenge einer der anderen...
Benutzeravatar
dot
Establishment
Beiträge: 1734
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: [C++] Inline Variables

Beitrag von dot »

DerAlbi hat geschrieben:Die Konstruktoraufruf-Abfolge ist mit inline-Variablen aber immer noch unklar. Das stinkt zum Himmel.
Wenn du einen Vorschlag für einen allgemeinen Ansatz hast, der es erlaubt die Inter-Modul-Initialisierungsreihenfolge von Objekten mit Static Storage Duration sinnvoll zu definieren, dann lade ich dich herzlich dazu ein, ein Proposal zu schreiben. Das Problem ist seit Jahrzehnten bekannt und bisher hat noch niemand eine zufriedenstellende Lösung präsentiert...

Imo aber auch kein Problem, denn was imo wirklich zum Himmel stinkt, ist Code der gerne von einer konkreten Inter-Modul-Initialisierungsreihenfolge von Objekten mit Static Storage Duration abhängen würde... ;)
Benutzeravatar
Krishty
Establishment
Beiträge: 8229
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: [C++] Inline Variables

Beitrag von Krishty »

dot hat geschrieben:In Summary: inline, __declspec(selectany) und __attribute__((weak)) tun alle drei imho verschiedene Dinge die sich semantisch zwar vielleicht überlappen aber keine der jeweiligen Semantiken wäre eine echte Teilmenge einer der anderen...
Ach so, okay. Ich meinte natürlich auch nicht, dass selectany und weak dadurch komplett ersetzt werden sollten, sondern eben nur, dass das COMDAT-Folding nun standardkonformes Fundament hat.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
dot
Establishment
Beiträge: 1734
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: [C++] Inline Variables

Beitrag von dot »

Krishty hat geschrieben:Ach so, okay. Ich meinte natürlich auch nicht, dass selectany und weak dadurch komplett ersetzt werden sollten, sondern eben nur, dass das COMDAT-Folding nun standardkonformes Fundament hat.
imo nicht mehr als zuvor!? Ich würde sagen dass inline Variablen uns vielleicht von Syntaxhacks erlösen aber keine fundamental neuen Möglichkeiten bringen. Zumindest sehe ich auf die Schnelle nicht was inline Variablen uns nun für ein Verhalten bescheren würden, was zuvor nicht auch schon irgendwie erreichbar gewesen wäre. inline gibt es schon seit Ewigkeiten und es tut nach wie vor genau das selbe wie eh und je; die Toolchain musste auch zuvor schon statische lokale Variablen in inline Funktionen genauso wie statische Member von class templates etc. korrekt behandeln...
Antworten