INTERVIEW #1

一、数据对齐存储

在32位系统中:int占4Bytes,short占2Bytes,char占1Byte,加起来应该是7Bytes,但是下面这段代码输出确是8。

 1 #define _CRT_SECURE_NO_WARNINGS
 2 
 3 #include <iostream>
 4 #include <cstdio>
 5 
 6 using namespace std;
 7 
 8 struct Node {
 9     int x;
10     short y;
11     char c;
12 };
13 
14 int main()
15 {
16     printf("%d\n", sizeof(Node));
17 
18     return 0;
19 }

计算机对于基本类型数据在内存中的存储位置有些限制,即内存对齐

处理器取数据一般不按照单个字节,而是双字节、四字节等进行,假设这种存取粒度为4Bytes,也就是说处理器只能从首地址为4的倍数的地址读取数据,这样子取数据会很麻烦,可能需要两次读取并且剔除掉无用的字节。

每个编译器都有默认的对齐模数,那么有效对齐值=min{对齐模数,结构体中最长数据类型长度}。

规则1:第一个成员offset为0,其后成员的offset=min{有效对齐值,该类型字节数};

规则2:结构体总大小必须为有效对齐值的整数倍,否则编译器会自动填充。

再看前面的例子,int占0~3,short占4~5,char占6,总长度为7,不是4的整数倍,所以地址7是填充字节,共8Bytes。

二、栈&堆

1、内存栈区

编译器自动进行分配和释放,存放局部变量、函数的参数

2、内存堆区

malloc或者new返回的内存区域,使用完需要用户free或delete,否则容易内存泄漏。

1 //在Heap中开辟20Bytes,同时在Stack中压入p,p的值为20Bytes的首地址
2 char* p = new char[10];

3、常数区

存放字符串常量等,程序结束由系统回收

4、静态区

存放全局变量或者静态变量,初始化的和没有初始化的分别存放在不同的区域,程序结束后由系统释放

5、代码区

存放程序代码

三、其它

猜你喜欢

转载自www.cnblogs.com/EIMadrigal/p/10484332.html