Ich habe 2 C-Funktionen verglichen, die eine Struktur zurückgeben. Wir wissen, dass große Strukturen auf ABI-Ebene als Zeiger auf das erste Funktionsargument übergeben werden.Was bedeutet eigentlich?
struct S {
int words[8];
};
struct S fsret() {
struct S s;
s.words[0] = 1;
return s;
}
void fout(struct S* s) {
s->words[0] = 1;
}
Für diese Funktionen habe ich die Assembly für x86_64 Linux und Windows überprüft. Die fsret
ist als void @fsret(%struct.S* sret %s)
deklariert.
Beim Vergleich dieser beiden Varianten gibt es keinen Unterschied auf der Callee-Seite. Innerhalb der Funktionen kopiert das fsret
jedoch zusätzlich sein erstes Argument (den Zeiger auf die Struktur) in das RAX-Register. Warum?
was, wenn Sie tun 'if (fsret() Worte [0] == 10.) {Do_something(); } '? der Compiler benötigt in diesem Fall einen Rückgabewert (nicht sicher, nur eine Idee) –