なぜGCCコンパイラがdoubleを使用するときにこの3行を追加するのか、そしてIntがあるときにGCCコンパイラがこの3行を追加するのはなぜですか?Int対アセンブリの倍数
#include <cstdio>
int main(){
int i = 1;
}
==>
main:
push ebp
mov ebp, esp
sub esp, 16
mov DWORD PTR [ebp-4], 1
mov eax, 0
leave
ret
ダブル付::
#include <cstdio>
int main(){
double i = 1;
}
==>int型で
main:
lea ecx, [esp+4] // This three lines
and esp, -8 // ...
push DWORD PTR [ecx-4] // ...
push ebp
mov ebp, esp
push ecx
sub esp, 20
fld1
fstp QWORD PTR [ebp-16]
mov eax, 0
add esp, 20
pop ecx
pop ebp
lea esp, [ecx-4]
ret
たとえば、int * s = new int(4)などのポインタを使用すると同様のことが起こります。
これがなぜ起こるのか、なぜそうでないのか説明できますか?
'-O3'スイッチを使用しないと、コンパイラは冗長でもナンセンスでもコードを生成します。(まだ正しいですが) –
はい、わかります。私はちょうど学んでいる:) –
これはCまたはC + +ですか?それらは異なる言語であり、関数の入力/終了のために異なるコードが生成される可能性があります。 – Olaf