结构体对齐问题
来源:互联网 发布:node全栈工程师招聘 编辑:程序博客网 时间:2024/05/17 02:14
昨天华为面试,问到了关于结构体对齐的问题。我懵逼了,结构体对齐是什么梗?一开始还以为是和资源受限的设备(单片机啊之类的嵌入式设备)开发有关。
今天下了下资料,发现原理是真的简单,当时多考虑一会应该能想出来的。
struct { char a; //1byte int b; //4byte char c[2] //2byte double d; //8byte}Struct_A;
在计算机内存中,结构体变量的存储通常是按字长对齐的,比如8位机里就按字节对齐,那么上述结构体共占用1+4+2+8=15byte。
在16位机里,变量就按照2字节对齐,比如a这个成员,虽然是个char类型,地址在0x80000000本身只占1字节,但是下一个成员b却不能使用0x80000001这个地址,而必须使用0x80000002,这就是按字长对齐。以上结构体占用的空间也就是2+4+2+8=16字节
同理,在32位机中,如果a在0x80000000的话,b只能放在0x80000004,因为这里的字长是4个字节。以上结构体占用空间4+4+4+8=20字节
也就是说总有一些字节是浪费掉的,这样做的目的很简单,就是因为在大多数计算机体系结构中,对内存操作时按整字存取才能达到最高效率,相当于是以空间换取时间。当然在某些计算机体系结构中,比如ARM,是支持非对齐字传输的,也就是说变量并不一定要按照字长对齐,尽管这样可能会降低效率,但换来的是存储空间上的节约。对于程序员来讲,则需要将结构体声明为紧凑型结构体。声明的关键字依编译器不同而异,你可以去查一下__packed关键字,可以得到更详细的说明。使用紧凑型结构体,则会强制编译器将结构体成员按1字节对齐,则以上结构体占用空间仍为15字节。
所以这里关键是在网上深处想,往计组和微机方向考虑一下应该不难想出来。
0 0
- 结构体对齐问题.
- 结构体对齐问题
- 结构体对齐问题
- 结构体对齐问题
- 结构体对齐问题
- 结构体对齐问题
- 结构体对齐问题
- 结构体对齐问题
- 结构体对齐问题
- 结构体对齐问题
- 结构体对齐问题
- 结构体对齐问题
- 结构体对齐问题
- 结构体数据对齐问题
- 结构体字节对齐问题
- 结构体字节对齐问题
- arm 结构体对齐问题
- 结构体字节对齐问题
- Spark2.1集群环境搭建小结(1)
- 合并两个排序链表
- 三月三十
- 在SpringMVC下面从零开始构建WebSocket服务
- LeetCode-Easy部分标签为HashTable#136 Single Number
- 结构体对齐问题
- 机器学习(4):python基础及fft、svd、股票k线图、分形等实践
- 细说new与malloc的10点区别
- 【模拟试题】逛公园
- H.264中的一些语法定义
- SerialPort常用修改属性方法
- java 类加载原理分析
- 浏览器对象
- C#中对象调用方法如果对象为空报异常的问题