C++字节对齐问题?(C语言字节对齐问题)
C语言字节对齐问题
目前编译器上(我是说visual c++)如果没有特别设置的话, 默认的对齐方式按下面几个规律
1. 每个成员对齐到它长度的整数倍
2. 整个结构的长度对齐到它最长成员长度的整数倍
3. 上面所说的长度,超过4的按4算。
就这个来说, b字段会被对齐到2字节位置, 最后整个会被对齐到6字节长
我不知道这几点是标准还是实现, 以后会不会有变化
C++字节对齐问题
如果是VC编译的话,pack(5) 是无效的,因为只能按偶数对齐。
你如果用VC编译这段程序,会发现编译器报出提示:warning C4086: expected pragma parameter to be '1', '2', '4', '8', or '16'
出现这个warning后,VC就按默认的8字节对齐,因此这个程序同8字节对齐的结果应该是一样的。
C++字节对齐问题
这是因为你的C/C++编译器进行了字对齐调整的缘故。
为了提高运行效率62616964757a686964616fe58685e5aeb931333234326438,有些编译器在默认的情况下做字对齐甚至双字对齐调整, 所有变量的存放起始地址都调整为字长的整数倍。即若字长32位,4字节,则所有变量的存放起始地址都是4的整数倍,而double类型更要起始在8的整数倍(双字对齐)。
于是,一个S2的结构就会这样存储(偏移量用十进制表示):
+0000 S2.c
+0004 S2.S1.a // 本来起始地址0001, 不是4的倍数,所以调整到0004
+0008 S2.S1.b // 调整到0008. 这个long变量实际占4字节。
+0016 S2.e // 本来起始地址0012, 不是8的倍数,所以调整到0016
+0024 ---- // double 本身占8字节,所以到这里就24字节了。
另外,如果一个结构含有双字类型的成员,他的大小也要调整成8的倍数。所以,如果在S2最后再加上一个成员char f, 那么它总的大小将是32字节。
当然,提高运行效率的同时浪费了一些存储空间。
有些编译器有对齐的选项,可以选择字对齐,半字对齐或双字对齐。编译时如果禁止对齐调整,则所有的变量也都是连续存放的。
(在线等)C 语言结构体字节对齐问题
这个对齐很好理解嘛,短的要对齐长的,比如你上面的例子没对齐前是
1
1111
1 //char是一字节嘛,这样没对齐,所以要对齐,对齐之后:
=======================================================
1111
1111
1111 //这样数一下,就是12字节嘛。但是如果换个位置的话,又不是这样了。比如:
=======================================================
struct sss
{
char c1;
char c2;
int n;
}
这是8字节跟上面的例子就不一样了。一样。没对齐之前是:
1
1
1111 //这上面最多补多少就能对齐?
系统是这样变化的:
11
1111 //把两个char放到一起,然后在补齐
=======================================
1111
1111 //这样就变成8字节了。