C专家编程看书笔记(2)
(睡觉了,记得明天看一下学习的时候教材上空间是如何分配的,感觉有出入。)
昨晚睡觉还是再想这里的一些问题,我想通过将结构体中各个类型的地址取出来看看,因为它们是连续的。但又出现一点疑问,是不是由于编译器不同造成的,很有必要在VC6.0上也进行测试,但我想不是现在,因为我得尽快把这pdf看完。
(《C语言程序设计》<谭浩强>)P309
书中原话:结构体变量所占内存长度是各成员占的内存长度之各。由此看来,至少现在我相信这句话是错的,因为我做的测试还不够。
下面我们来看一下上面说的,返回地址是什么样的。
能说什么呢,测试结果很让我崩渍,推翻了我上面的设想,但设想中也有部分正确,可以说方向正确了。庆幸我做了这块测试,首先我得到了正确的知识,最后,明确深深地理解到内存中字对齐的概念,原来字对齐我一下在喊口号,今天终于明白了,看来很有必要再做下Visual C++6.0下的测试。以上错误的部分,目前不会删除,因为他是我的心血,目前也只是我自己看,如果以后需要我会做相应修改。
继续上例子,唉(我相信下面我不会再是错的了,因为这是实际测试出来的),以下例子均是本机测试的值:
struct node_tag10{
char test0;
double test1;
short test2;
}c;
&char = 134518404,&double = 134518408,&short = 134518416.sizeof(c) = 16.
struct node_tag10{
char test0;
double test1;
short test2;
char test3;
}c;
&char = 134518432,&double = 134518436,&short = 134518444,&char = 134514446.sizeof(c) = 16.
struct node_tag10{
char test0;
double test1;
short test2;
char test3;
char test4;
}c;
&char = 134518440,&double = 134518444,&short = 134518452,&char = 1345184
54,&char = 134518455.sizeof(c) = 16.
struct node_tag10{
char test0;
double test1;
short test2;
char test3;
short test4;
char test5;
C专家编程学习中的笔记
}c;
&char = 134518468,&double = 134518472,&short = 134518480,&char = 134518482,&short = 134518484,&char = 134518486.sizeof(c) = 20.注意如果按以前我的认为,这里将会是16。
struct node_tag10{
char test0;
double test1;
short test2;
char test3;
short test4;
char test5;
char test6;
}c;
&char = 134518480,&double = 134518484,&short = 134518492,&char = 134518494,&short = 134518496,&char = 134518498,&char = 134518499.sizeof(c) = 20.注意如果按以前我的认为,这里将会是16。
struct node_tag10{
char test0;
short test1;
double test2;
short test3;
char test4;
short test5;
char test6;
char test7;
}c;
&char = 134518508,&short = 134518510,&double = 134518512,&short = 134518520,&char = 134518522,&short = 134518524,&char = 134518526,&char = 134518527.sizeof(c) = 20.
struct node_tag10{
short test0;
double test1;
short test2;
char test3;
short test4;
char test5;
char test6;
}c;
&short = 134518480,&double = 134518484,&short = 134518492,&char = 134518494,&short = 134518496,&char = 134518498,&char = 13451899.sizeof(c) = 20.
由上面这些可得,第一个分配地址总是能被4整除的,32位机,便于寻址。后面出现的类型(如int,double等)只要所占字节数大于或等于4个字节,也将会从能被4整除的地址开始,且与前面地址是连续的。下面这个能很好说明:
struct node_tag10{
char test0;
double test1;
short test2;
char test3;
short test4;
char test5;
}c;
&char = 134518468,&double = 134518472,&short = 134518480,&char = 134518482,&short = 134518484,&char = 134518486.sizeof(c) = 20.注意如果按以前我的认为,这里将会是16。
最后还是做一下Visual C++6.0上的测试:
sizechar = 1;sizeshort = 2;sizeint = 4;sizelong = 4;sizefloat = 4;sizedouble = 8;sizelongdouble = 8.
struct node_tag10{
short test0;
double test1;
short test2;
char test3;
short test4;
char test5;
char test6;
}c;
&short = 4339136,&double = 4339144,&short = 4339152,&char = 4339154,&short = 4339156,&char = 4339158,&char = 4339159.sizeof(c) = 24.与虚拟机上不同,无论第一个类型变成char,short,int,double都会占8个字节,除非一个也不要,就不会占8个字节。
将double改成int,前面第一个类型(char,short)会只占4个字节了。若改为short,前面的char又只占两上字节了,这,总之一句话,程序里面太多的神奇。
**********************************************************************************************************************************************************************
下午又得
出一点结论:
编译器存在字对齐问题,将以结构体中占字节最多的类型来对齐。(不同的平台,会有区别,就如是我的虚拟机(有double存在也会像样int以4个字节做为分配单无)与VC++6.0(有double存在将会以8个字节做为分配单元)结果不一样,这里我们以VC++6.0为准,在不同的平
C专家编程学习中的笔记
台可以实际进行测试,得出相应结果。)
struct node_tag{
char test0;
short test1;
int test2;
char test3;
int test4;
short test5;
};
sizeof(struct node_tag) = 20;虚拟机也是20。
struct node_tag{
char test0;
int test1;
double test2;
char test3;
double test4;
};
sizeof(struct node_tag) = 32;虚拟机是28。这个是分配单元的区别,VC++6.0以8字节,虚拟机上是以4字节。
从这里可以知道,在编写结构体时,我们可以恰当的组织数据类型的顺序,可以节省存储空间。我想,结构体我应该比较明白了吧。
P164
看到共用体,扩展测试:
同理关于共用体,《C语言程序设计》<谭浩强>(第三版)P309
共用体变量所占的内存长度等于最长的成员的长度。这是错误的。
union test{
char a[10];
int i;
}u;
sizeof(u) = 12.
union test{
char a[10];
double i;
}u;
sizeof(u) = 16.
同样,要求字对齐。
union test{
char a[17];
double i;
}u;
sizeof(u) = 24.
union test{
char a[17];
double i;
}u;
sizeof(u) = 20.注意,以8字节为分配单位。
enum test{sun,mon,tue,w
…… 此处隐藏:3507字,全部文档内容请下载后查看。喜欢就下载吧 ……
相关推荐:
- [资格考试]石油钻采专业设备项目可行性研究报告编
- [资格考试]2012-2013学年度第二学期麻风病防治知
- [资格考试]道路勘测设计 绪论
- [资格考试]控烟戒烟知识培训资料
- [资格考试]建设工程安全生产管理(三类人员安全员
- [资格考试]photoshop制作茶叶包装盒步骤平面效果
- [资格考试]授课进度计划表封面(09-10下施工)
- [资格考试]麦肯锡卓越工作方法读后感
- [资格考试]2007年广西区农村信用社招聘考试试题
- [资格考试]软件实施工程师笔试题
- [资格考试]2014年初三数学复习专练第一章 数与式(
- [资格考试]中国糯玉米汁饮料市场发展概况及投资战
- [资格考试]塑钢门窗安装((专项方案)15)
- [资格考试]初中数学答题卡模板2
- [资格考试]2015-2020年中国效率手册行业市场调查
- [资格考试]华北电力大学学习实践活动领导小组办公
- [资格考试]溃疡性结肠炎研究的新进展
- [资格考试]人教版高中语文1—5册(必修)背诵篇目名
- [资格考试]ISO9001-2018质量管理体系最新版标准
- [资格考试]论文之希尔顿酒店集团进入中国的战略研
- 全国中小学生转学申请表
- 《奇迹暖暖》17-支2文学少女小满(9)公
- 2019-2020学年八年级地理下册 第六章
- 2005年高考试题——英语(天津卷)
- 无纺布耐磨测试方法及标准
- 建筑工程施工劳动力安排计划
- (目录)中国中央空调行业市场深度调研分
- 中国期货价格期限结构模型实证分析
- AutoCAD 2016基础教程第2章 AutoCAD基
- 2014-2015学年西城初三期末数学试题及
- 机械加工工艺基础(完整版)
- 归因理论在管理中的应用[1]0
- 突破瓶颈 实现医院可持续发展
- 2014年南京师范大学商学院决策学招生目
- 现浇箱梁支架预压报告
- Excel_2010函数图表入门与实战
- 人教版新课标初中数学 13.1 轴对称 (
- Visual Basic 6.0程序设计教程电子教案
- 2010北京助理工程师考试复习《建筑施工
- 国外5大医疗互联网模式分析




