博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
内存对齐详细解释
阅读量:5966 次
发布时间:2019-06-19

本文共 1993 字,大约阅读时间需要 6 分钟。

如果结构体存储下标从0開始的

先是依照#pragma pack(8)參数依次和数据成员比較:依照成员下标是比較结果中小者的倍数;

最后再依照#pragma pack(8)參数与结构体成员占空间最大者比較,结构体总体的长度是比較结果中小者的倍数;

 

1、分析说明:

字节对齐(#pragma pack(2))

输出结果:sizeof(structtest_t) = 10 [两个编译器输出一致]

分析过程:

1) 成员数据对齐

#pragmapack(2)

structtest_t {

inta; /* 长度4> 2 按2 对齐;起始offset=00%2=0;存放位置区间[0,3]*/

charb; /* 长度1< 2 按1 对齐;起始offset=44%1=0;存放位置区间[4]*/

shortc; /* 长度2= 2 按2 对齐;起始offset=66%2=0。存放位置区间[6,7]*/

chard; /* 长度1< 2 按1 对齐;起始offset=88%1=0;存放位置区间[8]*/

};

#pragmapack()

成员总大小=9

2) 总体对齐

总体对齐系数=min((max(int,short,char), 2) = 2

总体大小(size)=$(成员总大小)$(总体对齐系数)圆整= 10 /* 10%2=0 */

 

 

 

2、实际样例:

 

样例:

#include 
#include
#include
/*先是依照#pragmapack(2)參数依次和数据成员比較:依照两者之中小者对齐;最后再依照#pragmapack(2)參数与结构体成员占空间最大者比較,总体的长度是小者的倍数;*/#pragma pack(4)struct test_1 { inta; /* 长度4 =4 按4 对齐。起始offset=00%4=0;存放位置区间[0,3]*/ charb; /* 长度1 < 4 按1 对齐。起始offset=44%1=0;存放位置区间[4] */ shortc; /* 长度2 < 4 按2 对齐;起始offset=66%2=0。存放位置区间[6,7]*/ chard; /* 长度1 < 4 按1 对齐;起始offset=88%1=0;存放位置区间[8] */ /*总体要求:成员中占空间最大的与pack(4)比較,总体长度依照小者对其 眼下总体length=9,而要求是4的倍数,因此结果须要是12 */};#pragma pack() #pragma pack(2)struct test_2 { inta; /* 长度4 > 2 按2 对齐。起始offset=0 0%2=0。存放位置区间[0,3] */ charb; /* 长度1 < 2 按1 对齐;起始offset=44%1=0。存放位置区间[4] */ shortc; /* 长度2 = 2 按2 对齐;起始offset=6 6%2=0。存放位置区间[6,7] */ chard; /* 长度1 < 2 按1 对齐。起始offset=88%1=0;存放位置区间[8] */ /*总体要求:成员中占空间最大的与pack(2)比較,总体长度依照小者对其 眼下总体length=9,而要求是2的倍数,因此结果须要是10 */};#pragma pack() int main(int argc, char *argv[]){ printf("%d\n", sizeof(struct test_1)); printf("%d\n", sizeof(struct test_2)); return 0;}

3、sizeof()測试结果:

int (*ptr)[3]; //ptr代表指针,因此測得值为4

int *ptr[3]; //ptr代表数组名,每一个成员是int * 。因此占3个*4=12

ptr代表数组名时,測得是数组所占内存空间的大小

ptr代表指针名时,測得是指针变空间由内存大小占用量

 

版权声明:本文博主原创文章,博客,未经同意不得转载。

你可能感兴趣的文章
项目管理: Maven 让事情变得简单
查看>>
传智播客--itcastbbs(四)
查看>>
【转】笔记本电脑关机时蓝屏是怎么回事
查看>>
UVA 10118 Free Candies
查看>>
How to remove replication in Syteline
查看>>
windows + visual studio 2010 配置SVN
查看>>
AXD+H-JTAG环境搭建总结
查看>>
Oracle 项目就是那回事 ----表空间的管理
查看>>
Linux命令常用的快捷键
查看>>
推荐一款图片轮换jQuery插件
查看>>
Reading papers_6(Pattern Recognition And Machine Learning一书,ing...)
查看>>
HDU 3441 Rotation
查看>>
[zz]KVM 虚拟机故障排除一例
查看>>
hadoop 权威指南学习笔记ing(1)
查看>>
从代码中抽离数据的原则
查看>>
[Bootstrap] 8. 'Collapse', data-target, data-toggle & data-parent
查看>>
Android面向HTTP协议发送post请求
查看>>
125 Valid Palindrome
查看>>
湾区见闻
查看>>
php通过数组存取mysql查询语句的返回值
查看>>