您的位置:首页 > 编程语言 > C语言/C++

C/C++面试(5)——sizeof字节计算

2015-10-26 16:03 513 查看
之前遇到一道专门考字节长度的题目,略坑。笔试时自我感觉良好,回来查答案才知道自己too young too simple.

1.基本数据类型长度(平时备忘,我直接放到电脑桌面上了)



但是在这里要注意,至于long double是16还是8,这个我也没太搞明白,我在windows 32位机器上运行是8,所以这个就存在争议了,知道原因的童鞋可以一起来交流一下。

2.union共用体
长度为联合中元类型(如数组,取其类型的数据长度)最大的变量长度(对齐单位)的整数倍,且要大于等于其最大成员所占的存储空间
3.struct结构体(在没有#pragma pack宏的情况下)

3.1、数据成员对齐规则:结构体(struct)的数据成员,第一个数据成员放在offset为0的地方,之后的每个数据成员存储的起始位置要从该成员大小的整数倍开始(比如int在32位机子上为4字节,所以要从4的整数倍地址开始存储)。
2、结构体作为成员:如果一个结构体里同时包含结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存储(如struct a里有struct b,b里有char,int ,double等元素,那么b应该从8(即double类型的大小)的整数倍开始存储)。
3、结构体的总大小:即sizeof的结果。在按之前的对齐原则计算出来的大小的基础上,必须还得是其内部最大成员的整数倍不足的要补齐(如struct里最大为double,现在计算得到的已经是11,则总大小为16)。
我就废话少说,直接上代码!

#include <stdlib.h>
#include <stdio.h>

//结构体
struct student1{
char num[10];   //对齐单位是:1
}Stu1;                  //总长:1*10 = 10

struct student2{
char num[10];   //[0] ~ [9]
int no[10];     //对齐单位是:4,[12]~[51]
}Stu2;                  //总长:52

struct student3{
int no[10];    //对齐单位是:4,[0]~[39]
char num[10];  //[40]~[49]
}Stu3;                 //总长度应为对齐单位(4)的倍数:52

typedef struct student4{
int id;        //对齐单位是:4,[0]~[3]
double weight; //对齐单位是:8,[8]~[15]
float height;  //[16]~[19]
}Stu4;                 //总长度应为对齐单位(8)的倍数:24

//结构体内嵌结构体
struct student5{
int id;        //对齐单位是:4,[0]~[3]
double score;  //对齐单位是:8,[8]~[15]
short grade;   //[16]~[17]
Stu4 aa;       //对齐单位是:8,[24]~[47]
char name[2];  //[48]~[49]
}Stu5;             //总长度应为对齐单位(8)的倍数:56

//联合体
union foo{
char s[10];    //对齐单位:1,总长度:10
int a;         //对齐单位:4,总长度:4
double d;      //对齐单位:8,总长度:8
}Foo1;                 //对齐单位:8,长度应为对齐单位的倍数:16

//联合体包含结构体
typedef union foo2{
Stu4 bb;       //对齐单位:8,总长度:24
char s[10];    //对齐单位:1,总长度:10
int a;         //对齐单位:4,总长度:4
double d;      //对齐单位:8,总长度:8
}Foo2;             //对齐单位:8,长度应为对齐单位的倍数:24

//结构体包含联合体
struct student6{
char num[10];  //对齐单位:1,[0]~[9]
int no[10];    //对齐单位:4,[12]~[51]
Foo2 cc;       //对齐单位:8,[56]~[79]
char a;        //对齐单位:1,[80]
double a1;     //对齐单位:8,[88]~[95]
int a2;        //对齐单位:4,[96]~[99]
}Stu6;             //对齐单位:8,长度应为对齐单位的倍数:104
//注意啰:即使相同的成员变量,但是排的位置不一样,字节长度也不一定相等。
//所以合理地安排成员变量的排序,的确可以节省空间
//但是在目前硬件资源越发便宜的今天,这点内存可能就不算的上什么了
//下面字节对齐还是比较好的,有轻微代码洁癖的童鞋可以看一下
struct student7{
char num[10];  //对齐单位:1,[0]~[9]
char a;        //对齐单位:1,[10]
int a2;        //对齐单位:4,[12]~[15]
int no[10];    //对齐单位:4,[16]~[55]
double a1;     //对齐单位:8,[56]~[63]
Foo2 cc;       //对齐单位:8,[64]~[87]
}Stu7;             //对齐单位:8,长度应为对齐单位的倍数:88

int main(void)
{
char ch;
char a_ch[10];
short snum;
int num;
long lnum;
float fnum;
double dnum;
long double ldnum;

printf("char = %d\n", sizeof(ch));
printf("char array = %d\n", sizeof(a_ch));  //1*10
printf("short = %d\n", sizeof(snum));
printf("int = %d\n", sizeof(num));
printf("long = %d\n", sizeof(lnum));
printf("float = %d\n", sizeof(fnum));
printf("double = %d\n", sizeof(dnum));
printf("long double = %d\n", sizeof(ldnum));

printf("struct1 = %d\n", sizeof(Stu1));
printf("struct2 = %d\n", sizeof(Stu2));
printf("struct3 = %d\n", sizeof(Stu3));
printf("struct4 = %d\n", sizeof(Stu4));
printf("struct5 = %d\n", sizeof(Stu5));
printf("struct6 = %d\n", sizeof(Stu6));
printf("struct7 = %d\n", sizeof(Stu7));

printf("union1 = %d\n", sizeof(Foo1));
printf("union2 = %d\n", sizeof(Foo2));

return 0;
}


运行结果:



相关链接(真心是良心之作):/article/10940919.html 讲解地十分详细透彻!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: