[笔试题]struct内存对齐
来源:互联网 发布:霍去病怎么死的 知乎 编辑:程序博客网 时间:2024/06/06 02:10
结构体的内存对齐实际上是硬件工程师的事,但是由于笔试经常考,而且我们在实际项目中由于设置的对齐方式不对曾经导致过在不同机器上不能移植的问题。所以有必要了解一下。
1.为什么需要内存对齐:因为计算机一次处理数据的单元不是字节,而是块。(即1 2 4 8 16字节)
2.struct是怎样进行内存布局的;
总体来说就是,某一中类型要在其尺寸大小整数倍的地址上放置,最后一个变量要补充空位(为了方便快速的实现这种结构体的数组)。
常用字节数(32位机):
int 一个字 32位,4字节
short 半个字 16位,2字节
long 一个字 32位,4字节
char 1字节
float 一个字 32位 ,4字节
double 两个字 64位, 8字节
看如下几个结构体的内存布局:
1. typedef struct ms1
{
char a;
int b;
} MS1;
内存布局为:1+3+4=8
_______________________________________
| |\\\\\\\\\\\| |
| a |\\padding\\| b |
| |\\\\\\\\\\\| |
+-------------------------------------+
Bytes: 1 3 4
2. typedef struct ms2
{ int a;
char b;
}MS2;
内存布局为:4+1+3=8;后面的3是填充字节。填充的长度是使得满足整体长度能够整除最大成员变量长度。即8/4。
3. typedef struct ms3
{
char a;
short b;
double c;
}ms3
内存布局为:1+1+2+4+8=16。short是2 所以1+1,得到的结果必须能被2整除。double是8,剩下的4个字节放不下,必须填充4个字节,这样1+1+2+4才是8的倍数,然后放入。
4. typedef struct ms4
{
char a;
ms3 b;
}
内存布局为: 1+7+16=24。b的最大成员变量是8,所以前面要填充7个字节。
如果要知道详细的情况,参考http://hi.baidu.com/phps/blog/item/f03eb93ee12f49fa838b1365.html
- [笔试题]struct内存对齐
- struct union 内存对齐
- (Struct)内存对齐
- struct 内存对齐
- struct内存对齐 详解
- union struct 内存对齐
- struct内存对齐
- (Struct)内存对齐
- struct内存对齐
- struct 内存对齐规则
- struct内存对齐
- struct/union内存对齐
- struct内存对齐
- struct内存对齐
- C++ struct内存对齐
- struct内存对齐
- 内存对齐(Struct)
- sizeof union struct 内存对齐
- jsp与JavaBean
- Android Camera Architecture
- 右键菜单“新建”的修改
- SED单行脚本快速参考--编号
- 链表面试题
- [笔试题]struct内存对齐
- 最小生成树 prim算法
- 限制textarea的字数
- 分享:我用Google Reader收集的非常不错的技术博客
- 8种排序算法
- Linux利器 strace
- MANIFEST.MF写法.txt
- Linux内核初始化过程的源码分析疑点记录+好书推荐(附下载)
- Spring Security学习总结二