C++面试问题汇总Day2

5. inline函数怎么理解 为什么可以加快运行 知识点:inline函数

答:在c/c++中,为了解决一些频繁调用的小函数大量消耗栈空间(栈内存)的问题,特别的引入了inline修饰符,表示为内联函数。

栈空间就是指放置程序的局部数据(也就是函数内数据)的内存空间。

只有当函数非常短小的时候它才能得到我们想要的效果

以下情况不宜使用内联: 

(1)如果函数体内的代码比较长,使用内联将导致内存消耗代价较高。 

(2)如果函数体内出现循环,那么执行函数体内代码的时间要比函数调用的开销大。类的构造函数和析构函数容易让人误解成使用内联更有效。要当心构造函数和析构函数可能会隐藏一些行为,如“偷偷地”执行了基类或成员对象的构造函数和析构函数。所以不要随便地将构造函数和析构函数的定义体放在类声明中。一个好的编译器将会根据函数的定义体,自动地取消不值得的内联(这进一步说明了 inline 不应该出现在函数的声明中)。

 

6.shared_ptr、unique_ptr是线程安全的吗,底层实现 知识点:智能指针

答:在MSDN的描述为:Multiple threads can simultaneously read and write different shared_ptr objects, even when the objects are copies that share ownership.

也就是说多个线程同时读写一个std::shared_ptr<>变量不安全。但多线程可以同时读写不同的std::shared_ptr<>变量,即使这些变量指向同一个对象。

所以如果希望在多个线程使用同一个对象的智能指针,可以让每个线程使用这个指针的不同副本或者使用锁保护这个指针。

6.1 是引用计数不安全还是对象修改不安全

答:不清楚

 

7. vector怎么增长、map的底层数据结构

答:vector为动态分配内存,如果容量满了,就分配现容量的两倍。

  map与multimap是STL中的关联容器、提供一对一key-value的数据处理能力; map与multimap的区别在于,multimap允许关键字重复,而map不允许重复。 这两个关联容器的底层数据结构均为红黑树

而unordered_map与unordered_multimap中key为无序排列,其底层实现为hash table,因此其查找时间复杂度理论上达到了O(n)

 

8. map怎么循环删除满足特定条件的元素

答: https://blog.csdn.net/u011417605/article/details/50863804

迭代器循环,如果满足条件则earse(it++),否则it++,因为删除之后,现迭代器会失效,一定要再earse参数中++;

 

9.c++的多态

答:  https://blog.csdn.net/qq_39412582/article/details/81628254

C++多态方式:

(1)静态多态(重载,模板)

是在编译的时候,就确定调用函数的类型。

(2)动态多态(覆盖,虚函数实现)

运行的时候,才确定调用的是哪个函数,动态绑定。运行基类指针指向派生类的对象,并调用派生类的函数。

虚函数实现原理:虚函数表和虚函数指针。

纯虚函数: virtual int fun() = 0;

 

10.一个空类是多大?加上一个成员函数?加上一个静态成员函数?加上一个静态成员?加上一个虚函数?

答: https://www.cnblogs.com/JingHuanXiao/p/6080726.html 讲的很清楚了

    *非静态成员变量总合。 

    *加上编译器为了CPU计算,作出的数据对齐处理。 

   *加上为了支持虚函数,产生的额外负担。

与与类中的构造函数、析构函数、拷贝构造函数、赋值运算符重载、取地址运算、const取地址运算无关。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值