struct结构体内存大小
一. 基本原则
1. struct中成员变量的声明顺序,与成员变量对应的内存顺序是一致的;
2. struct本身的起始存储地址必须是成员变量中最长的数据类型的整倍数,注意是最长的数据类型,而不是最长的变量
3. 内存对齐与编译器设置有关。
二. 计算规则(以下的所有规则,必须同时满足,并不是满足其中一条即可)
1. 每个成员变量相对于struct起始地址的偏移量,必须是成员变量自身类型长度的最小整倍数

int number;是声明的第一个成员变量,相对于S001起始地址的偏移量为0

double tmp; 是声明的第二个成员变量,类型double长度8,根据规则1偏移量必须是8的最小倍数,当前偏移量是4,需要补充4个字节,则偏移量为8

2. 结构体内存大小,必须是成员变量中类型长度最长者的整倍数,如果不是,则在最后一个成员变量后补齐

根据1,int number和double tmp在内存中样式如下:

char c;是声明的第三个成员变量,类型char 1字节,偏移量为16

现在内存是17个字节,结构体S002中成员变量double tmp类型最长8个字节,17不能整除8,能整除8的最小数是24,则在char c后填补7个字节到24个字节

3. 成员变量是数组时,按照类型长度对齐,而不是数组长度对齐

int number;是声明的第一个成员变量,相对于S001起始地址的偏移量为0

char c[10];是声明的第二个成员变量,类型char 1字节,数组长度10,注意是按照类型char 1字节计算偏移量,偏移量4

double tmp; 是声明的第三个成员变量,类型double长度8,根据规则1偏移量必须是8的最小倍数,当前偏移量是14,需要补充2个字节,则偏移量为16

一共24字节,是最大类型double长度8的整倍数
4. 成员变量是结构体时,根据struct基本原则,其存储偏移量必须是成员变量中最长的数据类型的整倍数(当进行规则2的判断时,结构体变量也是使用成员变量中最长类型,结合上边几条规则,这个其实很好理解的)
这里运行3组数据进行验证:
4-1> 如下图所示,结构体S004中结构体成员变量 S041 s41,结构体S041中成员变量的类型最长是1,因此s41的偏移量为14

4-2> 下图为另一组结果图, 结构体S004中结构体成员变量 S041 s41,结构体S041中成员变量的类型最长是int 4,S004.c[10]的偏移量为4,长度为10,即结束位置是14,14不能整除4,因此S004.s41的偏移量补齐到16

4-3> 下图中结构体S041中成员变量的类型最长是int 4,S004.c[10]偏移量为16,长度10,即结束位置为26,26不能整除4,所以补齐到28

5. 成员变量是联合体时,union的基本原则与struct一样,其存储偏移量必须是成员变量中最长的数据类型的整倍数,并且当进行规则2的判断时,联合体变量也是使用成员变量中最长类型(关于union的基本介绍,请看这里http://www.cnblogs.com/xieyajie/p/8086861.html)

struct结构体内存大小的更多相关文章
- C++ struct结构体内存对齐
•小试牛刀 我们自定义两个结构体 A 和 B: struct A { char c1; char c2; int i; double d; }; struct B { char c1; int i; ...
- C struct结构体内存对齐问题
在空间看到别人的疑问引起了我的兴趣,刚好是我感兴趣的话题,就写一下.为了别人的疑问,也发表在qq空间里.因为下班比较晚,10点才到家,发表的也晚.其实是个简单的问题. 直接用实例和内存图说明: #i ...
- 【APUE】Chapter17 Advanced IPC & sign extension & 结构体内存对齐
17.1 Introduction 这一章主要讲了UNIX Domain Sockets这样的进程间通讯方式,并列举了具体的几个例子. 17.2 UNIX Domain Sockets 这是一种特殊s ...
- C语言中结构体内存存储方式
C语言中结构体内存存储方式 结构体的默认存储方式采用以最大字节元素字节数对其方式进行对齐,例如一个结构体中定义有char.int类型元素,则结构体存储空间按照int类型占用字节,如果还有double类 ...
- C语言之结构体内存的对齐
C语言之结构体内存的对齐 大纲: 零.引例 一.结构体内存对齐规则 二.怎样计算结构体的大小 三.设计结构体时要注意的方面 四.为什么存在内存对齐 五.修改默认对齐数 在前面的章节中,我们谈到了C ...
- 关于结构体内存对齐方式的总结(#pragma pack()和alignas())
最近闲来无事,翻阅msdn,在预编译指令中,翻阅到#pragma pack这个预处理指令,这个预处理指令为结构体内存对齐指令,偶然发现还有另外的内存对齐指令aligns(C++11),__declsp ...
- C语言结构体内存分配详情
#include <stdio.h> int main() { /*************************************************** * * 结构体内存 ...
- [C/C++] 结构体内存对齐用法
一.为什么要内存对齐 经过内存对齐之后,CPU的内存访问速度大大提升; 内存空间按照byte划分,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定变量的时候经常在特定的内 ...
- [C/C++] 结构体内存对齐:alignas alignof pack
简述: alignas(x):指定结构体内某个成员的对齐字节数,指定的对齐字节数不能小于它原本的字节数,且为2^n; #pragma pack(x):指定结构体的对齐方式,只能缩小结构体的对齐数,且为 ...
随机推荐
- 坑暗花明:又遇 .NET Core 中 System.Data.SqlClient 查询缓慢的问题
之前发布过一篇博文 下单快发货慢:一个 JOIN SQL 引起 SqlClient 读取数据慢的奇特问题,当时遇到的问题是从 SQL Server 2008 R2 中查询获取 100 条记录竟然耗时 ...
- HDU - 1019 - Least Common Multiple - 质因数分解
http://acm.hdu.edu.cn/showproblem.php?pid=1019 LCM即各数各质因数的最大值,搞个map乱弄一下就可以了. #include<bits/stdc++ ...
- AtCoder Regular Contest 061 E - すぬけ君の地下鉄旅行【最短路】
具体题解又要搬大哥的了,嘿嘿~ 请点击:G点我 这道题目的难点就是同一家公司的路直接走不需要再花费,然后多了一个公司这个东西,这个不像是边的副权值(瞎说的)之类的东西,这是对于路来说的,路的属性... ...
- Metabolic and gut microbial characterization of obesity-prone mice under high-fat diet (文献分享一组-赵容丽)
题目:高脂饮食下易肥胖小鼠的代谢和肠道微生物特性研究 Metabolic and gut microbial characterization of obesity-prone mice under ...
- iOS中UIWebView使用JS交互
iOS中偶尔也会用到webview来显示一些内容,比如新闻,或者一段介绍.但是用的不多,现在来教大家怎么使用js跟webview进行交互. 这里就拿点击图片获取图片路径为例: 1.测试页面html & ...
- UVA10140 Prime Distance【素数/数论】By cellur925
题目传送门 我们注意到,L,R是肥肠大的.........我们不可能在1s内筛出2^31内的全部质数. “上帝为你关上一扇门,同时为你打开一扇窗” 我们又注意到,R-L是肥肠比较小的,珂以从这入手解决 ...
- pycharm中模块matplolib生成图表出现中文乱码解决方法
在python文件中加入如下两行 import matplotlib.pyplot as plt plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中 ...
- Mybatis分页中遇到的坑3
Mybatis Mapper.xml 配置文件中 resultMap 节点的源码解析 相关文章 Mybatis 解析配置文件的源码解析 Mybatis 类型转换源码分析 Mybatis 数据源和数 ...
- AtCoder Beginner Contest 051 ABCD题
A - Haiku Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem Statement As a New Yea ...
- 转 PHP函数---$_Get()和$_Post()的用法
一.$_Get()和$_Post()函数是用来传值的,即对应两种提交表单的方法,get和post. 二.$_Get方法 (1)获取通过URL的传值 Example 1 新建两个PHP文件,1.php, ...