Я сравнил 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. fsret
объявлен как void @fsret(%struct.S* sret %s)
.
Сравнивая эти два варианта, нет разницы на стороне вызываемого абонента. Однако внутри функций fsret
дополнительно копирует свой первый аргумент (указатель на структуру) в регистр RAX. Зачем?
, что если вы делаете 'если (fsret() слова [0] == 10.) {Do_something(); } '? компилятор нуждается в возвращаемом значении в этом случае (не уверен, просто идея) –