C/C++面试(5)——sizeof字节计算
来源:互联网 发布:淘宝怎么选购液晶电视 编辑:程序博客网 时间:2024/06/06 18:14
之前遇到一道专门考字节长度的题目,略坑。笔试时自我感觉良好,回来查答案才知道自己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 = 10struct student2{char num[10]; //[0] ~ [9]int no[10]; //对齐单位是:4,[12]~[51]}Stu2; //总长:52struct student3{int no[10]; //对齐单位是:4,[0]~[39]char num[10]; //[40]~[49]}Stu3; //总长度应为对齐单位(4)的倍数:52typedef 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,总长度:10int a; //对齐单位:4,总长度:4double d; //对齐单位:8,总长度:8}Foo1; //对齐单位:8,长度应为对齐单位的倍数:16//联合体包含结构体typedef union foo2{Stu4 bb; //对齐单位:8,总长度:24char s[10]; //对齐单位:1,总长度:10int a; //对齐单位:4,总长度:4double 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,长度应为对齐单位的倍数:88int 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*10printf("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;}
运行结果:
相关链接(真心是良心之作):http://blog.csdn.net/selinahuiling/article/details/9046403 讲解地十分详细透彻!
- C/C++面试(5)——sizeof字节计算
- 【c++】——sizeof与字节对齐
- 面试sizeof C语言各个类型占用字节书
- C/C++ 笔试面试(1)—— sizeof
- C/C++ 笔试面试(1)—— sizeof
- C/C++ 笔试面试(1)—— sizeof
- c/c++中使用sizeof计算结构体struct和类class的长度(字节)
- C语言——用sizeof求结构体所占字节长度
- C语言笔记:变量字节长度&取值范围——sizeof()VS strlen
- 解析C中的sizeof和字节对齐
- 解析C中的sizeof和字节对齐
- 解析C中的sizeof和字节对齐
- C语言关键字—sizeof
- C/C++——深入理解sizeof
- 面试珠玑 C语言中union与struct的区别及sizeof的计算方式
- 程序员面试(c++)——预处理,const与sizeof总结
- C/C++ 笔试面试(1)—— sizeof 非常实用的资料
- C/C++中的sizeof相关【面试?】
- sed和awk简介
- Teradata 修改表字段类型
- android 转小写
- JDBC 4 PreparedStatement 与Statement 的区别
- IOS--JSON介绍
- C/C++面试(5)——sizeof字节计算
- mysql出现Waiting for table metadata lock的原因及解决方案
- BZOJ 1109 [POI2007]堆积木Klo DP
- iOS首页广告滚动栏循环
- Hibernate 、多表关联映射 - 多对多关系映射(many-to-many)
- 响应式web布局
- Java爬虫,信息抓取的实现
- 解决eclipse安装maven的问题:Unable to update index for central|http://repo1.maven.org/maven2
- 压缩dp之noip提高组2005 过河