1. 首页 > 科技

C++字节对齐问题?(C语言字节对齐问题)

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字节了。