Perhatikan contoh berikut:
struct vector {
int size() const;
bool empty() const;
};
bool vector::empty() const
{
return size() == 0;
}
Kode perakitan yang dihasilkan untuk vector::empty
(oleh dentang, dengan optimisasi):
push rax
call vector::size() const
test eax, eax
sete al
pop rcx
ret
Mengapa ia mengalokasikan ruang stack? Itu tidak digunakan sama sekali. The push
dan pop
bisa dihilangkan. Membangun MSVC dan gcc yang dioptimalkan juga menggunakan ruang stack untuk fungsi ini (lihat di godbolt ), jadi pasti ada alasannya.
this
parameter implisit ?vector::size()
tidak didefinisikan dalam contoh untuk mensimulasi bahwa itu tidak diuraikan.vector::size()
tidak relevan untuk mengalokasikan atau tidak mengalokasikan frame stack untukvector::empty()
. Diempty()
dalamnya hanya disebut, apa pun itu.Jawaban:
Ini mengalokasikan ruang stack, sehingga tumpukan adalah 16-byte selaras. Dibutuhkan, karena alamat pengirim membutuhkan 8 byte, sehingga diperlukan ruang 8-byte tambahan untuk menjaga stack 16-byte tetap sejajar.
Penjajaran frame tumpukan dapat dikonfigurasi dengan argumen baris perintah untuk beberapa kompiler.
rsp
pada awal fungsi, yang berarti bahwa sesuatu yang lain juga mempengaruhi ini.-mstack-alignment
Opsi menentukan perataan tumpukan. Tampaknya, standarnya adalah 16, meskipun tidak didokumentasikan. Jika Anda mengaturnya ke 8, alokasi tumpukan (push
danpop
) menghilang dari kode perakitan yang dihasilkan.-mpreferred-stack-boundary
Opsi menentukan perataan tumpukan. Jika nilai yang diberikan adalah N, itu berarti 2 ^ N byte perataan. Nilai default adalah 4, yang berarti 16 byte. Jika Anda mengaturnya menjadi 3 (yaitu 8 byte), alokasi tumpukan (sub
danadd
untukrsp
) menghilang dari kode rakitan yang dihasilkan.Lihat di godbolt .
sumber