码迷,mamicode.com
首页 > 编程语言 > 详细

C++结构体字节对齐

时间:2015-08-30 00:55:14      阅读:212      评论:0      收藏:0      [点我收藏+]

标签:

本站文章均为Jensen抹茶喵原创,转载务必在明显处注明:
转载自【博客园】 原文链接:http://www.cnblogs.com/JensenCat/p/4770171.html

直接上源码吧!~

这里是头文件结构的定义:

一个非字节对齐结构体_tagTest2

一个字节对齐_tagTest3

(使用#pragma pack(push,1)来使字节以1个来对齐 , 使用#pragma pack(pop)来还原默认)

 1 #pragma once
 2 
 3 
 4 struct _tagTest1
 5 {
 6 };
 7 
 8 //非字节对齐的结果
 9 struct _tagTest2
10 {
11     int n1;
12     char ch1;
13     float f1;
14     char szName[21];
15     _tagTest1* pTag;
16 };
17 
18 #pragma pack(push,1)
19 //_tagTest3和2是一样的结构,字节对齐后的结果
20 struct _tagTest3
21 {
22     int n1;
23     char ch1;
24     float f1;
25     char szName[21];
26     _tagTest1* pTag;
27 };
28 
29 #pragma pack(pop) 

 

这里是实验代码:注释处写了分析,结果也入分析所料

 1 #include "msgdef.h"
 2 #include <Windows.h>
 3 #include <iostream>
 4 using namespace std;
 5 
 6 void main()
 7 {
 8     /*
 9     非字节对齐下,当前最大的空间是4个字节,所有结构都会向4个字节对齐...
10     int n1;                4
11     char ch1;            4        注解:1不是4的倍数..将扩张到4 
12     float f1;            4
13     char szName[21];    24        注解:21不是4的倍数..将扩张到24
14     _tagTest1* pTag;    4
15     总和为:40
16     */
17     _tagTest2 k2;
18     cout<<"size of _tagTest2: "<<sizeof(k2)<<endl;
19     //看看内存模型
20     k2.n1 = 1;
21     k2.ch1 = 1;
22     k2.f1 = 1.0f;
23     memset(k2.szName , 1 , sizeof(k2.szName));
24     k2.pTag = (_tagTest1*)&k2.n1;    //此处测试用,别纠结
25 
26 
27     /*
28     字节对齐下,
29     int n1;                4
30     char ch1;            1
31     float f1;            4
32     char szName[21];    21
33     _tagTest1* pTag;    4
34     总和为:34
35     */
36     _tagTest3 k3;
37     cout<<"size of _tagTest3: "<<sizeof(k3)<<endl;
38     //看看内存模型
39     k3.n1 = 1;
40     k3.ch1 = 1;
41     k3.f1 = 1.0f;
42     memset(k3.szName , 1 , sizeof(k3.szName));
43     k3.pTag = (_tagTest1*)&k3.n1;    //此处测试用,别纠结
44 
45      system("pause");
46 }

实验结果输出:如分析所说的一样

技术分享

这时候问题来了,那么字节不对齐时在内存是怎样的呢...下面是字节不对齐时的内存截图

技术分享

下面的顺序清楚的对应,其中字节对齐的空位在内存里面补了cc,这个为什么本人没有深究,其他变量一目了然了,

至于浮点数的内存模型为什么是这样,可以度娘一下,很多人分析了浮点数float的内存模型。

 

C++结构体字节对齐

标签:

原文地址:http://www.cnblogs.com/JensenCat/p/4770171.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!