手册上介绍:
The stack pointer for a stack segment should be aligned on 16-bit (word) or 32-bit (double-word)
boundaries, depending on the width of the stack segment. The D flag in the segment descriptor
for the current code segment sets the stack-segment width (refer to Chapter 3, Protected-Mode
Memory Management of the Intel Architecture Software Developer’s Manual, Volume 3). The
PUSH and POP instructions use the D flag to determine how much to decrement or increment
the stack pointer on a push or pop operation, respectively. When the stack width is 16 bits, the
stack pointer is incremented or decremented in 16-bit increments; when the width is 32 bits, the
stack pointer is incremented or decremented in 32-bit increments.
The processor does not check stack pointer alignment. It is the responsibility of the programs,
tasks, and system procedures running on the processor to maintain proper alignment of stack
pointers. Misaligning a stack pointer can cause serious performance degradation and in some
instances program failures.
在实际测试时,需要视编译器而定,即便是相同的编译器,不同的优化策略得出的结果也有可能不同。
比如:
char ch1;
char ch2;
在VC++6.0的debug版本,分别占用4个字节,但若是RELEASE版本为了优化大小,则分别只占用1个字节。
再比如GCC,DEBUG版本直接就是分别占用1个字节。