今天参加的C/C++笔试,总的来说,感觉已经比以前好多了,相信是每天及时总结的缘故,废话不多说,下面继续坚持。
今天大致做了三块内容,首先计算机网络通信,然后是数据结构部分,最后才是C/C++的题目。
前两者另外再做小结,先就C/C++。
(1)内存对齐问题:
对这个问题,以前我也总结过,一段时间没有回看尽然有点忘了。想了想,今天没有结合具体的编译器说明,回答的不够严谨是我最大的败笔。
问题的引出:
struct F
{
char a;
int b;
}
使用sizeof(F)的答案是8个字节而不是简单的相加。
“内存对齐”的概念:许多实际的计算机系统对基本类型的数据在内存中存放位置有限制,常要求这些数据的首地址是某个数值的倍数,这就是所谓的内存对齐。
从性能上来说,在对齐的地址上访问数据的速度快。位于32位的系统每次总线周期只能读到4个字节。
上面的一个数据成员a与结构体的偏移量为0,总是存放在偏移量为0的地址上,其他成员对齐到某个数字(对齐数)的整数倍,该数字是默认对齐数和该成员的字节数的较小值。结构体的总大小是最大对齐数的整数倍。
GNU g++对齐数只能取1,2,4,默认是4,其余跟win平台一样。
1 #include <stdio.h>
2 struct a
3 {
4 char b;
5 char c;
6 short ccd;
7 unsigned char d;
8 };
9
10 struct e
11 {
12 char f;
13 char g;
14 short h;
15 char *i;
16 };
17
18 int main()
19 {
20 printf("%d\n",sizeof(struct a));
21 printf("%d\n",sizeof(struct e));
22 return 0;
23 }
打印结果为,6,8.