Porównałem funkcje 2 C zwracające struct. Wiemy, że na poziomie ABI duże struktury będą przekazywane przez wskaźnik jako pierwszy argument funkcji.Co właściwie oznacza ten sret?
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;
}
Dla tych funkcji sprawdziłem złożenie dla x86_64 Linux i Windows. Numer fsret
jest zadeklarowany jako void @fsret(%struct.S* sret %s)
.
Porównując te dwa warianty, nie ma różnicy po stronie odbiorcy. Jednak wewnątrz funkcji fsret
dodatkowo kopiuje swój pierwszy argument (wskaźnik do struktury) do rejestru RAX. Czemu?
co jeśli nie 'if (fsret() słowa [0] == 10). {Do_something(); } '? kompilator potrzebuje wartości zwracanej w tym przypadku (nie jestem pewien, tylko pomysł) –