内存对齐的三条原则

1:数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小或者成员的子成员大小(只要该成员有子成员,比如说是数组,结构体等)的整数倍开始(比如int在32位机为4字节,则要从4的整数倍地址开始存储。

2:结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存储.(struct a里存有struct b,b里有char,int ,double等元素,那b应该从8的整数倍开始存储.)

3:收尾工作:结构体的总大小,也就是sizeof的结果,.必须是其内部最大成员的整数倍.不足的要补齐。

 1 typedef struct bb
 2 {
 3  int id;             //[0]....[3]
 4  double weight;      //[8].....[15]      原则1
 5  float height;      //[16]..[19],总长要为8的整数倍,补齐[20]...[23]     原则3
 6 }BB;
 7 typedef struct aa
 8 {
 9  char name[2];     //[0],[1]
10  int  id;         //[4]...[7]          原则1
11  double score;     //[8]....[15]    
12  short grade;    //[16],[17]        
13  BB b;             //[24]......[47]          原则2
14 }AA;
15 int main()
16 {
17   AA a;
18   cout<<sizeof(a)<<" "<<sizeof(BB)<<endl;
19   return 0;
20 }

结果是

48 24

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏从零开始学自动化测试

pytest文档9-参数化parametrize

这将运行测试,参数设置为x=0/y=2,x=1/y=2,x=0/y=3,x=1/y=3组合参数。

922
来自专栏高爽的专栏

HTML DOM(一):认识DOM

什么是DOM?        通过 JavaScript,您可以重构整个HTML文档。您可以添加、移除、改变或重排页面上的项目。要改变页面的某个东西,Java...

1780
来自专栏C/C++基础

C++的数据类型

C++是一种强类型语言。C++程序中的任何变量(或函数)必须遵循“先说明后使用”的原则。定义数据类型有两个方面的作用:一是决定该类型的数据在内存中如何存储,二是...

672
来自专栏青玉伏案

算法与数据结构(一) 线性表的顺序存储与链式存储(Swift版)

温故而知新,在接下来的几篇博客中,将会系统的对数据结构的相关内容进行回顾并总结。数据结构乃编程的基础呢,还是要不时拿出来翻一翻回顾一下。当然数据结构相关博客中我...

1847
来自专栏从零开始学自动化测试

python笔记18-sort和sorted区别

python的排序有两个方法,一个是list对象的sort方法,另外一个是builtin函数里面sorted,主要区别:

671
来自专栏极客慕白的成长之路

系统讲解CSS应用

<input type="radio" name="radio1" id="radio1-2" /> <label for="radio1-2">选项二</la...

411
来自专栏烂笔头

Python标准库笔记(9) — functools模块

1503
来自专栏移动开发面面观

Python中的正则表达式

1085
来自专栏iOS开发攻城狮的集散地

run timeimport : 成员变量、类、方法

1539
来自专栏数据之美

Python 基础:类与函数

1、Python 中的类(上) 1.1 数据属性 类数据属性和实例数据属性 特殊的类属性 属性隐藏 1.2 方法 实例方法 类方法 ...

1969

扫描关注云+社区