最近笔试总结二
来源:互联网 发布:涤纶 锦纶 知乎 编辑:程序博客网 时间:2024/05/16 15:21
二:i++与++i
一直一来,只知道i++刚开始改变的是表达式的值,i本身的值不变,只有当表达式执行完毕,i本身才会发生变化,而++i却是刚开始i的值就发生了变化。
这样说并不直观,我们来举例子:
eg:
- i=6;
- while(i++>6)//这个循环中的i++>6是进不去的 此刻 这个i是6,只有当这句话执行结束后,i才会变为7
- {
- printf("Hello!\n");
- break;
- }
- while(++i>6)//这个循环中,i在一开始就会自己增加到7.所以会执行printf语句。
- {
- printf("world!\n");
- break;
- }
int *p;
sizeof(p)=4;//但sizeof(*p)相当于sizeof(int);
对于静态数组,sizeof可直接计算数组大小;
int a[10];char b[]="hello";
sizeof(a)等于4*10=40;
sizeof(b)等于6;
注意:数组做型参时,数组名称当作指针使用!!
void fun(char p[])
{
sizeof(p)//等于4
}
经典问题:
double* (*a)[3][6];
cout<<sizeof(a)<<endl; // 4 a为指针
cout<<sizeof(*a)<<endl; // 72 *a为一个有3*6个指针元素的数组
cout<<sizeof(**a)<<endl; // 24 **a为数组一维的6个指针
cout<<sizeof(***a)<<endl; // 4 ***a为一维的第一个指针
cout<<sizeof(****a)<<endl; // 8 ****a为一个double变量
使用sizeof时string的注意事项
string s="hello";
sizeof(s)等于string类的大小,sizeof(s.c_str())得到的是与字符串长度。
union 与struct的空间计算
总体上遵循两个原则:
(1)整体空间是 占用空间最大的成员(的类型)所占字节数的整倍数
(2)数据对齐原则----内存按结构成员的先后顺序排列,当排到该成员变量时,其前面已摆放的空间大小必须是该成员类型大小的整倍数,如果不够则补齐,以此向后类推。。。。。
注意:数组按照单个变量一个一个的摆放,而不是看成整体。如果成员中有自定义的类、结构体,也要注意数组问题。
例:
因为对齐问题使结构体的sizeof变得比较复杂,看下面的例子:(默认对齐方式下)
cout<<sizeof(s1)<<endl; // 24
cout<<sizeof(s2)<<endl; // 16
同样是两个char类型,一个int类型,一个double类型,但是因为对齐问题,导致他们的大小不同
对于s1,首先把a放到8的对界,假定是0,此时下一个空闲的地址是1,但是下一个元素b是double类型,要放到8的对界上,离1最接近的地址是8了,所以b被放在了8,此时下一个空闲地址变成了16,下一个元素c的对界是4,16可以满足,所以c放在了16,此时下一个空闲地址变成了20,下一个元素b需要对界1,也正好落在对界上,所以b放在了20,结构体在地址21处结束。由于s1的大小需要是8的倍数,所以21-23的空间被保留,s1的大小变成了24。
对于s2,首先把a放到8的对界,假定是0,此时下一个空闲地址是1,下一个元素的对界也是1,所以b摆放在1,下一个空闲地址变成了2;下一个元素c的对界是4,所以取离2最近的地址4摆放c,下一个空闲地址变成了8,下一个元素d的对界是8,所以d摆放在8,所有元素摆放完毕,结构体在15处结束,占用总空间为16,正好是8的倍数。
这里有个陷阱,对于结构体中的结构体成员,不要认为它的对齐方式就是他的大小
cout<<sizeof(s1)<<endl; // 8
cout<<sizeof(s2)<<endl; // 8
cout<<sizeof(s3)<<endl; // 9
cout<<sizeof(s4)<<endl; // 16;
s1和s2大小虽然都是8,但是s1的对齐方式是1,s2是8(double),所以在s3和s4中才有这样的差异。
所以,在自己定义结构体的时候,如果空间紧张的话,最好考虑对齐因素来排列结构体里的元素。
double* (*a)[3][6];
cout<<sizeof(a)<<endl; // 4 a为指针
cout<<sizeof(*a)<<endl; // 72 *a为一个有3*6个指针元素的数组
cout<<sizeof(**a)<<endl; // 24 **a为数组一维的6个指针
cout<<sizeof(***a)<<endl; // 4 ***a为一维的第一个指针
cout<<sizeof(****a)<<endl; // 8 ****a为一个double变量
使用sizeof时string的注意事项
string s="hello";
sizeof(s)等于string类的大小,sizeof(s.c_str())得到的是与字符串长度。
union 与struct的空间计算
总体上遵循两个原则:
(1)整体空间是 占用空间最大的成员(的类型)所占字节数的整倍数
(2)数据对齐原则----内存按结构成员的先后顺序排列,当排到该成员变量时,其前面已摆放的空间大小必须是该成员类型大小的整倍数,如果不够则补齐,以此向后类推。。。。。
注意:数组按照单个变量一个一个的摆放,而不是看成整体。如果成员中有自定义的类、结构体,也要注意数组问题。
例:
因为对齐问题使结构体的sizeof变得比较复杂,看下面的例子:(默认对齐方式下)
- struct s1
- {
- char a;
- double b;
- int c;
- char d;
- };
- struct s2
- {
- char a;
- char b;
- int c;
- double d;
- };
cout<<sizeof(s2)<<endl; // 16
同样是两个char类型,一个int类型,一个double类型,但是因为对齐问题,导致他们的大小不同
对于s1,首先把a放到8的对界,假定是0,此时下一个空闲的地址是1,但是下一个元素b是double类型,要放到8的对界上,离1最接近的地址是8了,所以b被放在了8,此时下一个空闲地址变成了16,下一个元素c的对界是4,16可以满足,所以c放在了16,此时下一个空闲地址变成了20,下一个元素b需要对界1,也正好落在对界上,所以b放在了20,结构体在地址21处结束。由于s1的大小需要是8的倍数,所以21-23的空间被保留,s1的大小变成了24。
对于s2,首先把a放到8的对界,假定是0,此时下一个空闲地址是1,下一个元素的对界也是1,所以b摆放在1,下一个空闲地址变成了2;下一个元素c的对界是4,所以取离2最近的地址4摆放c,下一个空闲地址变成了8,下一个元素d的对界是8,所以d摆放在8,所有元素摆放完毕,结构体在15处结束,占用总空间为16,正好是8的倍数。
这里有个陷阱,对于结构体中的结构体成员,不要认为它的对齐方式就是他的大小
- struct s1
- {
- char a[8];
- };
- struct s2
- {
- double d;
- };
- struct s3
- {
- s1 s;
- char a;
- };
- struct s4
- {
- s2 s;
- char a;
- };
cout<<sizeof(s2)<<endl; // 8
cout<<sizeof(s3)<<endl; // 9
cout<<sizeof(s4)<<endl; // 16;
s1和s2大小虽然都是8,但是s1的对齐方式是1,s2是8(double),所以在s3和s4中才有这样的差异。
所以,在自己定义结构体的时候,如果空间紧张的话,最好考虑对齐因素来排列结构体里的元素。
补充:不要让double干扰你的位域
在结构体和类中,可以使用位域来规定某个成员所能占用的空间,所以使用位域能在一定程度上节省结构体占用的空间。不过考虑下面的代码:
cout<<sizeof(s1)<<endl; // 24
cout<<sizeof(s2)<<endl; // 24
cout<<sizeof(s3)<<endl; // 24
cout<<sizeof(s4)<<endl; // 16
可以看到,有double存在会干涉到位域(sizeof的算法参考上一节),所以使用位域的的时候,最好把float类型和double类型放在程序的开始或者最后。
四:windows消息队列的机制
(1)窗口消息:指的是由操作系统和控制其他窗口的窗口所使用的消息
(2)命令消息:这是特殊窗口消息,用来处理从一个窗口到另一个窗口的用户请求
(3)空间通知消息:一个窗口内的子空间发生了一些事件,需要通知父窗口
在结构体和类中,可以使用位域来规定某个成员所能占用的空间,所以使用位域能在一定程度上节省结构体占用的空间。不过考虑下面的代码:
- struct s1
- {
- int i: 8;
- int j: 4;
- double b;
- int a:3;
- };
- struct s2
- {
- int i;
- int j;
- double b;
- int a;
- };
- struct s3
- {
- int i;
- int j;
- int a;
- double b;
- };
- struct s4
- {
- int i: 8;
- int j: 4;
- int a:3;
- double b;
- };
cout<<sizeof(s2)<<endl; // 24
cout<<sizeof(s3)<<endl; // 24
cout<<sizeof(s4)<<endl; // 16
可以看到,有double存在会干涉到位域(sizeof的算法参考上一节),所以使用位域的的时候,最好把float类型和double类型放在程序的开始或者最后。
四:windows消息队列的机制
(1)窗口消息:指的是由操作系统和控制其他窗口的窗口所使用的消息
(2)命令消息:这是特殊窗口消息,用来处理从一个窗口到另一个窗口的用户请求
(3)空间通知消息:一个窗口内的子空间发生了一些事件,需要通知父窗口
- 最近笔试总结二
- 最近笔试总结一
- 最近笔试面试总结
- 最近一周笔试面试总结
- Java-最近面试笔试总结
- 最近笔试题整理(二)
- 最近笔试面试没答全的题目总结
- Java笔试题总结(二)
- 笔试面试总结(二)
- C++ prime/笔试 总结二
- yahoo中国 最近的笔试题目之 cpp二则。
- 最近总结的android疑惑(二)
- C++笔试总结-面试笔试常考题型(二)
- JAVA笔试题总结(二)
- IT公司笔试题总结(二)
- C++笔试题总结(二)
- 个人总结php笔试题二
- 最近笔试面试有感
- 黑马程序员-- .Net学习日记——数据库
- 从一个jsp页面向另一个jsp页面传值
- php cURL库(抓取网页,post数据及其他)
- 用xfire客户端调用服务端时,传递参数总是null
- C#调用asp页面或php页面,反回页面数据方法
- 最近笔试总结二
- Xcode中联调静态库工程
- CString、TCHAR *、char*转换
- ERP的扫盲知识
- 提防假冒的太阳能充电软件
- 框架学习之Spring 第二节 采用Spring管理Bean和依赖注入
- STM32GPIO——快速IO的使用
- SQLserver数据库连接问题(wfa程序登录源代码)
- php插件 HTMLPurifier HTML解析器