我比较了2个C函数返回一个结构。我们知道,在ABI级别上,大结构将作为第一个函数参数传递指针。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;
}
对于这些函数,我检查了x86_64 Linux和Windows的程序集。被宣布为void @fsret(%struct.S* sret %s)
。
比较这两个变体,被调用方没有区别。但是,在函数内,还将其第一个参数(指向结构的指针)复制到RAX寄存器。为什么?
如果你做'如果(fsret()字[0] == 10){do_something(); ''?在这种情况下编译器需要返回值(不确定,只是一个想法) –