网站由什么组成,网站建设代码,网站模板下载,注册公司流程和费用是多少笔者最近在找工作时#xff0c;无意间读到了一本名为《剑指offer》的书#xff0c;粗略翻阅了一下#xff0c;感觉这将会是一本能让我不再苦恼于笔试和面试“手搓代码”的书。故笔者写下该系列博客记录自己的学习历程#xff0c;希望能和这本书的读者朋友们一起交流学习心得… 笔者最近在找工作时无意间读到了一本名为《剑指offer》的书粗略翻阅了一下感觉这将会是一本能让我不再苦恼于笔试和面试“手搓代码”的书。故笔者写下该系列博客记录自己的学习历程希望能和这本书的读者朋友们一起交流学习心得。 介绍《剑指Offer名企面试官精讲典型编程题第2版》剖析了80个典型的编程面试题系统整理基础知识、代码质量、解题思路、优化效率和综合能力这5个面试要点。 编程题链接牛客网在线编程_算法面试_面试必刷TOP101 (nowcoder.com) 本博客关键词sizeof 介绍
在C/C中sizeof是一个关键字也是一个运算符用来获取类型或对象在内存中所占的字节大小。sizeof不是函数在代码的编译阶段就会执行。sizeof计算内存占用大小的应用场景基本数据类型、数组、结构体、类、指针、枚举、联合体等。
引入
先阅读一下代码预测下cout对应的输出都会是什么假设代码在64位机器上运行
#include iostreamusing namespace std;// 空类型
class MyClass1
{
};// 添加了构造函数和析构函数的空类型
class MyClass2
{MyClass2();~MyClass2();
};// 析构函数为虚函数的空类型
class MyClass3
{MyClass3();virtual ~MyClass3();
};int main(int argc, char const *argv[])
{char str1[10] hello;const char *str2 hello world;int num1[10];int *num2 new int[10];cout sizeof(int) endl;cout sizeof(double) endl;cout sizeof(long) endl;cout sizeof(str1) endl;cout sizeof(str2) endl;cout sizeof(num1) endl;cout sizeof(num2) endl;cout sizeof(NULL) endl;cout sizeof(MyClass1) endl;cout sizeof(MyClass2) endl;cout sizeof(MyClass3) endl;return 0;
}结果如下 cout sizeof(int) endl; // 4cout sizeof(double) endl; // 8cout sizeof(long) endl; // 8cout sizeof(str1) endl; // 10cout sizeof(str2) endl; // 8cout sizeof(num1) endl; // 40cout sizeof(num2) endl; // 8cout sizeof(nullptr) endl; // 8cout sizeof(MyClass1) endl; // 1cout sizeof(MyClass2) endl; // 1cout sizeof(MyClass3) endl; // 8分析
sizeof(int)这个输出为4很好理解int类型占用4个字节的内存。sizeof(double)输出为8也很好理解double类型占用8个字节的内存。sizeof(long)输出为8。在32位机器中long占4个字节在64位机器中long占8个字节。sizeof(str1)输出为10str1对应了数组str1[10]。sizeof(str2)输出为8str2对应一个指针。这里大家第一次看可能会有疑问明明有”数组名称代表数组首元素地址“的说法为什么sizeof(str1)和sizeof(str2)的输出结果不一样呢我是这样理解的首先str2在这里确实是一个指针所以sizeof(str2)对应的值是8这是很好理解的但是对于数组str1[10]str1本质上只是数组名它并不占用任何的内存它代表的是数组它可以表示数组首元素的地址但实际上数组首元素的地址是str1[0]对应的地址str1数组名不占用实际内存。当使用sizeof运算符通过数组名计算数组内存占用时数组名表示的是整个数组而不是某个地址。根据第5点的解释很容易可以得出sizeof(num1)的输出为40sizeof(num2)的输出为8。sizeof(nullptr)输出为8关键字 nullptr 表示空指针。 接下来就是对sizeof(MyClass)的分析也是书里提到的一个案例。 提问定义一个空类型里面没有任何成员变量和成员函数对该类型求sizeof结果是多少答案空类型的示例中不包含任何信息但是在声明该类型的实例时必须在内存中有一定的空间否则无法使用这些实例。至少占用多少字节的内存由编译器决定在GCC中每个空类型的实例占用1字节。提问如果在空类型中加入一个构造函数和一个析构函数再求sizeof结果是多少答案仍然是1调用构造函数和析构函数只需要知道函数的地址即可而函数的地址只与类型相关编译器因为这两个函数而在实力内添加任何额外的信息。提问如果将析构函数标记为虚函数呢答案在32位机器中输出为4在64位机器中输出为8。因为C编译器一旦发现类型中有虚函数就会为该类型生成虚函数表并在该类型的每一个实例中添加一个指向虚函数表的指针。 空类型如下
// 空类型
class MyClass1{};加了构造函数和析构函数函数内容也为空
// 添加了构造函数和析构函数的空类型
class MyClass2
{MyClass2();~MyClass2();
};将析构函数标记为虚函数
// 析构函数为虚函数的空类型
class MyClass3
{MyClass3();virtual ~MyClass3();
};