初识联合体、结构体中的数据对齐问题

原创作品,出自 “晓风残月xj” 博客,欢迎转载,转载时请务必注明出处(http://blog.csdn.net/xiaofengcanyuexj)。

由于各种原因,可能存在诸多不足,欢迎斧正!

     了解计算机体系结构,有利于高效编程。为了加快CPU与存储器之间的数据交换速度,通常要求struct中的变量可以一次存取。这就要求struct中占内存空间最多的变量的前后都为它的倍数。下面谈谈最近注意到的联合体、结构体中的数据对齐问题。希望与大家一起学习交流。

 

       看看下面这段程序:

#include <stdio.h>
#include<iostream>
using namespace std;

struct Struct
{
	char a;
    int b;
    double c;
} ;


union Union
{
	char a;
    int b;
	double c;
};

int main()
{
    printf("%d\n",sizeof(Struct));
	printf("%d\n",sizeof(Union));
    system("pause");
}

      结果是什么呢?可能很多人知道,结果是16、8

      对于联合体,所占内存空间为成员变量中占内存最大的变量所占的空间。

     而对于结构体,可能就要复杂一些。依据要求struct中占内存空间最多的变量的前后都为它的倍数。char占1字节,int占4字节,double占8字节。为保持double可一次存取,a,b合起来占8个

字节,共占16字节。

 

 

#include <stdio.h>
#include<iostream>
using namespace std;

struct Struct
{
	int aa;
	char a;
	int b;
	double c; 
	
};

int main()
{
    printf("%d\n",sizeof(Struct));
    system("pause");
}

        上面这个占24字节。,int+char+int=12字节,调整为16字节,与double合起来,共占24字节。

 

 

#include <stdio.h>
#include<iostream>
using namespace std;

struct Struct
{
	char a;
	double b; 
	char c;
}aa;

int main()
{
    printf("%d\n",sizeof(Struct));
    system("pause");
}

           同理,上面占24字节,double前后的char都应分配占8字节。

 

#include <stdio.h>
#include<iostream>
using namespace std;

struct Struct
{
	char a;
	int b;
	double c;
	int d[5];
};

int main()
{
	printf("%d\n",sizeof(Struct));
	system("pause");
}

         上面的呢?有前面的分析可知40字节。double前面的char+int占8字节,double占8字节,intd[5]本应占4*5=20字节,但为了对齐,调整为24字节,共40字节。

 

 

 

#include <stdio.h>
#include<iostream>
using namespace std;

struct Struct
{
	char a;
	int b;
	double c;
	int d[5];
	char e;
};


struct MyStruct
{
	Struct a;
	char b;
	
};

int main()
{
	printf("%d\n",sizeof(Struct));
	printf("%d\n",sizeof(MyStruct));
	system("pause");
}

         上面的占48字节。

 

部分内容师从http://www.cnblogs.com/hlxs/archive/2012/10/03/2711128.html;在此表示感谢!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值