An extended comment:
According to GCC documentation about -malign-double
:
Aligning double
variables on a two-word boundary produces code that runs somewhat faster on a Pentium at the expense of more memory.
On x86-64, -malign-double
is enabled by default.
Warning: if you use the -malign-double
switch, structures containing the above types are aligned differently than the published application binary interface specifications for the 386 and are not binary compatible with structures in code compiled without that switch.
A word here means i386 word which is 32 bits.
Windows uses 64-bit alignment of double
values even in 32-bit mode, while SysV i386 ABI conformant Unices use 32-bit alignment. The 32-bit Windows API, Win32, comes from Windows NT 3.1, which, unlike current generation Windows versions, targeted Intel i386, Alpha, MIPS and even the obscure Intel i860. As native RISC systems like Alpha and MIPS require double
values to be 64-bit aligned (otherwise hardware fault occurs), portability might have been the rationale behind the 64-bit alignment in the Win32 i386 ABI.
64-bit x86 systems, know also as AMD64 or x86-64, or x64, require double
values to be 64-bit aligned otherwise a misalignment fault occurs and the hardware does an expensive "fix-up" which considreably slows down memory access. That's why double
values are 64-bit aligned in all modern x86-64 ABIs (SysV and Win32).
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…