構造体を返す2つのC関数を比較しました。私たちは、ABIレベルでは、大きな構造体が最初の関数引数としてポインタによって渡されることを知っています。実際に何が意味するのですか?
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;
}
これらの機能については、x86_64 LinuxとWindowsのアセンブリをチェックしました。はvoid @fsret(%struct.S* sret %s)
と宣言されています。
これら2つのバリエーションを比較すると、呼び出し側で違いはありません。しかし、関数の中では、は、最初の引数(構造体へのポインタ)をさらにRAXレジスタにコピーします。どうして?
何(fsret()の言葉は[0] == 10){do_something場合は)( '行う場合。 } '?コンパイラはその場合に戻り値を必要とします(わかりません、ちょうどアイデア) –