原创作品,出自 “晓风残月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;在此表示感谢!