Es ist ganz einfach.
Überlegen Sie, wie Compiler die Adresse kennt, in diesem Code zu nennen:
puts("hey!");
Compiler hat keine Ahnung von der Lage von puts
, und es auch nicht zu einem Laufzeitsuche für sie hinzufügen (das wäre eher schlecht für die Leistung, obwohl es ist, was virtuelle Methoden der Klassen tun müssen. Die Möglichkeit, zur Laufzeit eine andere Version der dynamischen Bibliothek zu haben (ganz zu schweigen von der Adressraum-Layout-Randomisierung, auch wenn es sich um exakt dieselbe Bibliotheksdatei handelt), stellt sicher, dass der Toolchain-Linker für die Build-Zeit es auch nicht kennt.
So ist es an der dynamic linker, um die Adresse zu beheben, wenn es das kompilierte Binärprogramm startet. Dies wird Verlagerung genannt.
Exakt gleiche geschieht mit Ihrem constexpr
: Compiler jeden Ort im Code mit dieser Adresse in der Tabelle Verlagerung fügt, und dann dynamische Linker macht seinen Job jedes Mal das Programm startet.
Der Linkernel tut diesen Job nicht den Compiler. Linker findet heraus, wo sich die Dinge befinden –
Es ist nie die echte Adresse – Arunmu
@EdHeal Das ist immer noch vor der Ausführung, und ich verstehe nicht, warum der Wert für jede Ausführung gleich sein kann ?! – Coolwater