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)。
我就废话少说,直接上代码!
运行结果:
相关链接(真心是良心之作):/article/10940919.html 讲解地十分详细透彻!
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 讲解地十分详细透彻!
相关文章推荐
- 读《C专家编程》笔记-第三章 分析C语言的声明
- C语言:编写一个程序统计输入字符串中,各个数字、空白字符、以及其他所有字符出现的次数。
- 【详解】C语言:编写一个函数itob(int n,char s[], int b),将整数n转换为以b进制的数。保存到s中。
- c++中try_catch的使用,二维数组动态创建
- C语言--把一个字符串的内容逆序
- C++设计模式之建造者模式(改编自C++设计模式)
- 几种常见排序算法
- C语言--模拟库函数strcpy,strcat,strcmp
- C++内存管理
- [标准C/C++基础]用指针指向string类的对象
- C++ STL中的vector的内存分配与释放
- C语言--求字符串长度的三种解法
- C语言--冒泡排序
- c语言学习之基础知识点介绍(七):循环结构
- c++捕获halcon异常
- C++设计模式之单例模式(改编自C++设计模式)
- C++STL学习(11)STL算法(2)
- C++给函数传数组参数
- 栈stack的小知识
- C++用链表存放数据