c++基础
1、malloc/free和new/delete的异同点?
2、cpp程序运行时内存模型?
答:代码区,只读的区域,是代码被翻译成二进制机器指令存储的地方;数据区,分为初始化数据区和未初始化数据区,用来存储全局变量和static变量的地方;堆区,动态内存分配的地方,new和malloc分配就是从此处分配;栈区,函数调用所有使用的内存区域,遵循先进后出的规则。
3、cpp程序函数调用,内存中栈是如何工作的?
答:当函数调用时,首先,函数返回地址入栈,然后形参入栈,局部变量入栈,执行函数,函数返回值存入cpu寄存器,最后依次出栈。
4、指针和引用的异同点?
答:
5、union共用体的作用是什么?
答:union有不同类型的成员,共用同一块内存地址,这样做的目的是节省内存。可以用在有不同类型数据,但不同时有效的情况。
6、struct如何确定占用内存大小?
答:首先,确定对齐标准,以结构体成员中最大内存成员为标准;然后,依次存放结构体成员,要求每次按照对齐标准取数据,能完整的把某些数据成员取出来;最后,struct内存大小必须为对齐标准的整数倍。
7、extern C的作用是什么?
答:为了处理C/Cpp混合编程的重要特性。主要是cpp为了兼容c语言,调用c编写好的库,由于cpp为了支持函数重载,c++编译的函数名与c语言编译的函数名不一致,因此cpp调用c编译好的库函数,需要使用extern c来告诉编译器,按照c的标准来链接c函数。
8、机器大小端存储问题?
机器大端存储,是说将数据字节的高位放到内存低地址部分。(按照人习惯的顺序存储)
机器小端存储,是说数据高位放到内存的高地址部分。
使用union关键字可以方便识别机器按照大端存储还是小端存储。
9、static的用法?
答:首先,修饰局部变量,将其变成静态变量,在main函数运行前进行初始化,仅仅初始化一次,后面不再初始化,函数运行结束,该变量仍在内存的数据区。
第二,修饰全局变量和全局函数,隐藏全局变量,让其仅能在当前文件中可见。与extern作用正好相反。
第三,修饰类的的函数,让函数变成静态函数,该函数属于类,不属于类实例化的对象。
第四,类的静态成员变量,需要在类的外部初始化。
10、const的用法。
答:将变量变成只读,不能被修改。mutable可以突破const的封锁,就像friend可以突破类中private成员封锁一样。
const 修饰变量:将其变成只读。
const type * 指针:不能通过指针修改指向内存的内容。
type * const 指针:不能指针的指向。
const修饰类的成员变量:成员变量只能在初始化列表中初始化。
const修饰类的成员函数:成员函数不能修改成员变量的值。
const类,类的实例化对象只能访问const成员函数。
11、volatile关键字的作用?
答:阻止编译器对volatile修饰的变量进行优化,是的每次访问变量都是从内存读取,而不是从cpu寄存器里面读取。
用到的场景有:首先,多线程应用共享同一个变量;第二,并行设备的硬件寄存器。
12、nullptr和NULL的区别?
答:
13、为什么浮点数相等的判断不推荐使用==?
答:因为浮点数只有23位有效数字,能表示数的精读有限,浮点数在运算过程中会造成精读或多或少的损失,即使在数学上相等,但是计算机里不一定相等,
因此推荐使用相减求绝对值小于一个epsilon来判断是否相等。
14、cpp中异常的使用。
cpp中用于异常处理的关键字有try,catch,throw,所有异常的基类是std::exception,位于头文件<exception>中。这些东西都是需要积累的。
15、cpp中的类型转换有哪些?
答:static cast 和 dynamic cast 两个关键字。static cast在编译时进行类型转换,dynamic是在运行时进行类型转换,dynamic是安全的类型转换,如果转换失败,抛出std::bad_cast异常。
在基类转子类的过程中,如果使用static cast转换,即使基类转错误的子类,也会正常运行,不会报错。此时程序已经发生了错误。
因此,基类转子类,必须使用dynamic cast.
16、explicit关键字的作用是什么?
答:阻止类的构造函数提供默认的隐式转化,当类的构造函数只有一个参数时,编译器默认为该类提供了默认的隐式转换机制。explicit就可以阻止这个隐式转换的生成。
17、c++多态是如何实现的,从编译器的角度讲一讲?(什么是动态绑定和静态绑定)
18、什么是cpp抽象类。
答:至少包含一个纯虚函数的类。virtual void foo() = 0;
19、如何禁止程序自动生成拷贝构造函数和赋值函数。
答:使用delete关键字,c++11引入的标准。
20、什么是一致性哈希?(未知)
答:
21、c++从代码到可执行文件经历了什么?
答:预处理-编译-汇编-链接。
预处理:会翻译所有的预处理指令,展开宏定义,执行条件编译指令,执行#include指令,删除所有注释,添加行号,保留#pragma编译器指令。生成.i文件
编译:将预处理好的文件进行编译,经过词法分析、语法分析、语义分析、优化等过程,生成汇编代码文件。生成.s文件。
汇编:将汇编代码翻译成机器指令。生成.o文件。
链接:将.o文件链接成可执行文件。分为静态链接和动态链接。静态链接,就是不库文件全部打包进可执行文件;动态链接,就是不把库加载进去,把位置留好,等运行时再动态加载库。
运行:代码区、数据区、堆区、栈区。
22、c语言如何实现cpp的类继承和多态?
答:
23、cpp的几种锁?(没有解释清楚)
答:互斥锁用于互斥,条件变量用于同步。
24、为什么c++没有垃圾回收机制?
答:因为垃圾回收会带来空间和时间上的开销,垃圾回收存储动态分配内存的指针计数,需要另开一个线程在空闲时间释放没有用到的内存。
内存管理
1、类对象的存储空间大小?
答:类对象非静态成员的内存之和+虚函数指针的大小。
2、c++程序的内存分区。
答:从低地址到高地址分别为:代码区、数据区(常量区、全局变量区(全局变量和static变量))、堆区、空闲区、栈区。
c++11标准
1、auto和decltype的作用是什么?
答:auto用来自动推断变量的类型,省去了写类型的麻烦。decltype用来求表达式的类型。
2、nullptr是c++11新增的关键字。
答:为了兼容C的NULL而引入,C中,NULL被定义为(void*) 0,而在cpp中,NULL被定义为 0。nullptr是明确的指针类型,不会与整型0混淆。
3、c++类中比较关键的函数有哪些?
答:默认构造函数,拷贝构造函数,移动构造函数,赋值操作符,移动赋值操作符,析构函数。
4、lambda表达式的作用是什么?
答:就是匿名函数,用来简化函数的定义。说白了还是语法糖。
5、智能指针的作用是什么?
答:为了解决堆内存泄露和动态内存分配引发的错误,而引入智能指针,c++11引入了三个智能指针,shared ptr, unique ptr, weak ptr。shared ptr是最常用的智能指针,
可以使用多个指针指向同一块堆内存,unique ptr只允许一个指针指向分配的堆内存,weak ptr是为了解决shared ptr指针循环引用无法释放内存而引入,就是为了解决循环引用问题。
6、auto_ptr的用法是什么?
答:
7、手写实现智能指针需要重写什么函数?
答:额外提供计数指针、构造函数、拷贝构造函数、赋值运算符、移动构造函数。移动赋值运算符。
标准模板库STL
0、STL中,有哪些模块。
答:基本包括:容器、迭代器、算法。他们各自有什么用途,如何进入计算机图形学
1、STL中,allocator的用法是什么?
答:
2、STL中,什么是迭代器。怎么使用?
答:迭代器是STL提供用来访问和遍历容器的机制。迭代器提供了一组标准的方式来访问容器,用户无需关注容器内部实现,就能实现访问和遍历。基本用法就是for循环,begin()和end()。
3、什么cpp中的左值和右值?(回答的太好了!!)
总结:cpp中所有变量的值都可以分为左值和右值,左值是有名字能取地址的变量的值,一般位于等号左边,右值就是没有名字不能取地址的变量的值,左值一般在等号左边,右值一般在等号右边。举个例子,int a = b+2,其中,a就是左值,(b+2)就是右值。右值包括:纯右值和将亡值,纯右值是cpp98就有的,将亡值是cpp11提出的标准,纯右值包括字面常量、临时变量、函数返回值、lambda表达式,将亡值就是那种通过盗窃其他变量地址空间来的值,如std::move获取的值,通过T&&强转获取的值。
继续:左值引用和右值引用的区别?首先,都是引用,都必须在声明时初始化,左值引用是对左值进行的引用,右值引用是对右值初始化进行的引用。左值引用只能使用左值进行初始化,不能使用右值进行初始化。const 左值引用可以使用左右值初始化。右值引用只能使用右值初始化。因此, int& a = 10; 这句话编译不通过,因为10是右值,a是左值引用,只能通过左值进行初始化。
4、什么是完美转发?
答:
5、什么是移动语义?
答:
6、cpp中特性萃取是什么?traits有什么作用?<type_traits>
答:traits是一种模板编程技术,用于编译时获取类型的信息。
7、常见容器性质总结。
vector:是顺序表,内存空间连续,可以随机存取,缺点就是插入和删除时间复杂度高,内存必须连续,内存空间扩容耗时。
list:是双向链表,内存空间不一定连续,不能随机存取,但是插入和删除效率高,扩容时时间消耗低。
deque:双端队列,内存不一定连续,底层通过分块存储和分块查找的方式实现,可以随机存取,是vector+list的升级版,但是只能在收尾操作,也不存在扩容耗时的问题。
map:有序字典,底层使用红黑树实现。查询时间复杂度为O(logn)
unordered_map:无序字典,底层使用哈希存储实现。高效查询,使用哈希表,查询和插入时间复杂度为O(1),但是建立哈希表的时间过程较长。
8、红黑树的基本概念是什么?现场写红黑树的可能性比较小。
答:如何进行
9、哈希表解决冲突的办法有哪些?
答:线性探测法:就是冲突了向后一位存放;拉链法:相同关键字的地方,使用一个链表来存储,链表可以自由扩展;再散列:冲突了,则使用新的哈希函数在散列;平方探测法:按照交替检测的方式来查看冲突。
标签:初始化,函数,右值,左值,C++,面试,考点,内存,cpp From: https://www.cnblogs.com/LadissonLai/p/18182727