结构体不对齐会导致什么问题

C++语言 码拜 8年前 (2016-05-25) 2745次浏览
如题。说会导致程序速度变慢,来一段具体代码说明一下。
例如cpu一次从内存读取8字节,一个double型假如对齐的话读一次就行,不对齐读2次。但是在本人看来,这对程序的速度基本没有什么影响。
有人能举一段不对齐对程序效率影响特别大的代码吗。
另外除了效率问题,不对齐还会造成什么其他问题呢。
解决方案

5

引用:

如题。说会导致程序速度变慢,来一段具体代码说明一下。
例如cpu一次从内存读取8字节,一个double型假如对齐的话读一次就行,不对齐读2次。但是在本人看来,这对程序的速度基本没有什么影响。
有人能举一段不对齐对程序效率影响特别大的代码吗。
另外除了效率问题,不对齐还会造成什么其他问题呢。

有的 CPU 不对齐会变慢,有的不会,也有的直接就 core 了。这个与 CPU 有关。

10

引用:
Quote: 引用:
Quote: 引用:

如题。说会导致程序速度变慢,来一段具体代码说明一下。
例如cpu一次从内存读取8字节,一个double型假如对齐的话读一次就行,不对齐读2次。但是在本人看来,这对程序的速度基本没有什么影响。
有人能举一段不对齐对程序效率影响特别大的代码吗。
另外除了效率问题,不对齐还会造成什么其他问题呢。

有的 CPU 不对齐会变慢,有的不会,也有的直接就 core 了。这个与 CPU 有关。

所以现在结构体对齐这个问题不是特别重要了?

只比较一次操作的话这效率差别是会很小
多数情况下宁可牺牲内存换效率
另一个典型的情况是用BOOL代替bool

5

与处理器相关,对于Pentium Pro以来的x86/x64处理器,常规指令访问数据,目标地址能否对齐到操作宽度(例如32位访问对齐到32位地址)影响很小,数据能否跨越cache line影响比较大。而某些RISC处理器只能访问对齐地址。

5

引用:
Quote: 引用:

现代编译器都是自动对齐的吧。

是的,还会有现代编译器无法满足的情况吧。主要是本人现在不是很清楚什么时候自定义对齐呢。

本人猜有吧,不过编了这么久程序,还没遇到需要本人手动对齐的情况呢。

5

现在电脑的配置,没有必要纠结这个问题了。

10

1. sizeof会出错
2. 不对齐的话,不能使用0字节数组
3. 效率不高(跟CPU架构有关,在ring3层这个问题基本可以忽略不计,但是在ring0级别,或一些对效率有特别要求的场合还是很有影响的,例如路由器,防火墙之类的设备,在做C-T时,一秒钟都可能需要分配几万到几百万个连接,效率差一点点都不行)
4. 不对齐的话,有时候程序会越界访问,而且这类问题很难定位。

20

序列化的时候,发送结构体数据的时候

5

楼上说的对,序列化时必须要考虑

10

对单机处理来说,字节不对齐最多是性能问题(其实你也察觉不出来),主要问题会发生在异机尤其是异种机的数据交换上。
抛开字节序的问题不谈,假如字节没有指定对齐方式,那么同一个结构体定义在不同的平台上长度很可能不同。
如送数据的时候不拼数据缓冲,直接用结构指针和结构长度的方式发送,那么接收端用同样的结构体指针强转的话,
就会出现数据错位的问题。
所以网络封包结构体一般强制pack(1),1字节对齐。

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明结构体不对齐会导致什么问题
喜欢 (0)
[1034331897@qq.com]
分享 (0)