Zusammenhängender Speicher garantiert mit C ++ - Funktionsparametern

9

Appel [App02] erwähnt sehr kurz, dass C (und vermutlich C ++) Garantien bieten bezüglich der Positionen der tatsächlichen Parameter im zusammenhängenden Speicher im Gegensatz zu Registern, wenn der Adressenoperator auf einen der formalen Parameter innerhalb des Funktionsblocks angewendet wird.

z.B.

%Vor%

und ein Aufruf wie ...

%Vor%

erzeugt die folgende Ausgabe "1 2 3 4"

Meine Frage ist "Wie funktioniert das mit Aufrufkonventionen?"

Zum Beispiel wird __fastcall auf GCC versuchen, die ersten beiden Argumente in den Registern und den Rest auf dem Stapel zu platzieren. Die beiden Anforderungen stehen im Widerspruch zueinander, gibt es eine Möglichkeit, formell zu begründen, was passieren wird, oder unterliegt es der kapriziösen Natur des implementierten Verhaltens?

[App02] Moderne Compiler-Implementierung in Java, Andrew w. Appel, Kapitel 6, Seite 124

Update: Ich nehme an, dass diese Frage beantwortet wird. Ich glaube, ich lag falsch, die ganze Frage auf zusammenhängende Speicherzuteilung zu gründen, als das, wonach ich suchte (und worüber die Referenz spricht), die offensichtliche Diskrepanz zwischen der Notwendigkeit von Parametern im Speicher aufgrund der Verwendung von Address-of im Gegensatz zu ist in Registern aufgrund von Aufrufkonventionen, vielleicht ist das eine Frage für einen anderen Tag.

Jemand im Internet ist falsch und manchmal ist das jemand ich.

    
DuncanACoulter 29.03.2011, 11:36
quelle

4 Antworten

3

Zuallererst produziert Ihr Code nicht immer 1, 2, 3, 4. Überprüfen Sie einfach diesen: Ссылка Korrekter Code ist mindestens wie dies :

%Vor%

So, jetzt versuchen wir es mit fastcall , hier :

%Vor%

Ergebnis ist chaotisch: 1 -1216913420 134514560 134514524

Also bezweifle ich wirklich, dass hier etwas garantiert werden kann.

    
Andrey 29.03.2011, 11:47
quelle
1

Der C ++ - Standard hat kein Konzept einer Aufrufkonvention. Das ist für den Compiler zu erledigen.

Wenn in diesem Fall der Standard erfordert, dass die Parameter zusammenhängend sind, wenn der address-of-Operator angewendet wird, besteht ein Konflikt zwischen dem, was der Standard von Ihrem Compiler verlangt, und dem, was Sie dafür benötigen / p>

Es liegt am Compiler zu entscheiden, was zu tun ist. Ich denke, die meisten Compiler würden Ihren Anforderungen Vorrang vor den Standards geben.

    
Collin Dauphinee 29.03.2011 11:49
quelle
1

Im Standard gibt es nichts über das Aufrufen von Konventionen oder wie Parameter übergeben werden.

Es stimmt, dass wenn Sie die Adresse einer Variablen (oder eines Parameters) nehmen, die im Speicher gespeichert werden muss. Es besagt nicht, dass der Wert nicht in einem Register übergeben und dann in den Speicher gespeichert werden kann, wenn seine Adresse genommen wird.

Es hat definitiv keinen Einfluss auf andere Variablen, deren Adressen nicht vergeben werden.

    
Bo Persson 29.03.2011 11:59
quelle
0

Ihre Grundannahme ist fehlerhaft. Auf meinem Rechner druckt foo(1,2,3,4) mit Ihrem Code:

  

1 -680135568 32767 4196336

Verwendung von g++ (Ubuntu 4.4.3-4ubuntu5) 4.4.3 auf 64-Bit x86.

    
NPE 29.03.2011 11:48
quelle