Bir yapıya dönen 2 C işlevi karşılaştırdım. ABI seviyesinde büyük yapıların birinci işlev argümanı olarak işaretçiden geçeceğini biliyoruz.Aslında ne anlama geliyor?
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;
}
Bu işlevler için x86_64 Linux ve Windows için derlemeyi kontrol ettim. fsret
, void @fsret(%struct.S* sret %s)
olarak beyan edilmiştir.
Bu iki varyantı karşılaştırarak, callee tarafında bir fark yoktur. Bununla birlikte, işlevlerin içinde fsret
ek olarak ilk argümanını (yaprağa işaretçi) RAX kaydına kopyalar. Niye ya?
Ne (fsret() kelimeler [0] == 10.) {Do_something eğer) ('yaparsanız; } '? Derleyici bu durumda bir dönüş değeri gerektirir (emin değilim, sadece bir fikir) –