最近不少同学开始找工作,很多关于C语言和C++的细节问题被重新揪出来称为热门话题。关于C语言里struct字节对齐的问题,网上查了一些结果,发现不是很全面(一般都没有关于struct里出现位字段时的总结),这里总结一下。
字节对齐的原因:在特定的计算机系统平台下,提高内存访问的效率。在不同的编译器和不同的平台下,字节对齐规则不太一样。
Win32平台下Visual C++ 6.0编译器中字节对齐的总结:
struct A { char a; char b; char c; }; //3 bytes, no alignment struct A { char a; char b; int c; }; //8 bytes: a(1), b(1), ALIGN_FILL(2), c(4) struct A { char a; short b; int c; }; //8 bytes: a(1), ALIGN_FILL(1), b(2), c(4) struct A { char a; short b; char c; }; //6 bytes: a(1), ALIGN_FILL(1), b(2), c(1), ALIGN_FILL(1) struct A { char a; int b; char c; }; //12 bytes: a(1), ALIGN_FILL(3), b(4), c(1), ALIGN_FILL(3) struct A { char a : 1; char b : 2; char c : 1; }; //1 byte, no alignment: a and b and c (1) struct A { char a : 1; char b : 2; char : 0; //force the next field align to the next byte char c : 1; }; //2 bytes: the 0 bit field forces alignment struct A { int a : 1; int b : 2; int c : 1; }; //4 bytes, no alignment: a and b and c (4) struct A { int a : 10; int b : 15; int c : 10; }; //8 bytes: a and b (4), c(4) struct A { short a : 1; int b : 2; int c : 1; }; //8 bytes: a(2), ALIGN_FILL(2), b and c (4) struct A { short a : 1; int b : 20; int c : 20; }; //12 bytes: a(2), ALIGN_FILL(2), b(4), c(4) struct A { short a : 1; int b : 2; char c : 1; }; //12 bytes: a(2), ALIGN_FILL(2), b(4), c(1), ALIGN_FILL(3)