C++面试基础知识复习系列——二

1、类的对象在内存中所占空间的分析;

参考:https://blog.csdn.net/shufac/article/details/37915147;

1>空类,占用一个字节。原因,为了区分不同类的实例。

2>在没有虚函数的类的对象中,类的对象所占空间的大小分析方式与struct类型所占空间的大小相同,只需要计算非静态数据成员。因为成员函数的函数地址被保存在的代码段,而数据成员保存在数据段。

3>静态成员变量不占用类的对象的存储空间。

4>当类中存在虚函数的时候,在实例化对象的时候,编译器会自动在对象里安插一个指针指向vPtr指向虚函数表vTable。

5>考虑内存对齐的问题。

 

2、智能指针。unique_ptr/shared_ptr/weak_ptr/auto_ptr(C++11已经弃用)。

参考:https://www.zhihu.com/question/20368881

智能指针和普通指针相比实际上是对普通指针加了一层封装机制,这样的一个封装机制的目的在于使得智能指针可以方便的管理一个对象的生命期。一个对象在什么时候析构或者是什么条件下析构是受智能指针本省决定的,不需要用户的管理;

1>scoped_ptr。

scoped_ptr在其作用域之外会被析构,它是non-copyable的,为了防止多次析构同一个指针所指向的对象。

2>shared_ptr。其实现的本质是引用计数,也就是说shared_ptr是支持复制的,复制一个shared_ptr的本质是对这个智能指针的引用次数加1,而当这个智能指针的引用次数降至0的时候,该对象自动被析构。假设shared_ptr所表征的引用关系中出现了一个环,那么环上所述对象的引用次数不可能减为0,也就不会被删除,为了解决这个问题引入了weak_ptr。

3>weak_ptr。它与shared_ptr最大的区别在于weak_ptr在指向一个对象的时候不会增加其引用计数,因此你可以在一个weak_ptr在指向一个对象的时候去析构它。当再次访问weak_ptr的时候,会返回空的shared_ptr。

实际上,通常shared_ptr内部实现的时候维护的就不是一个引用计数,而是两个引用计数,一个表示strong reference,也就是用shared_ptr进行复制的时候进行的计数,一个是weak reference,也就是用weak_ptr进行复制的时候的计数。weak_ptr本身并不会增加strong reference的值,而strong reference降低到0,对象被自动析构。为什么要采取weak_ptr来解决刚才所述的环状引用的问题呢?需要注意的是环状引用的本质矛盾是不能通过任何程序设计语言的方式来打破的,为了解决环状引用,第一步首先得打破环,也就是得告诉C++,这个环上哪一个引用是最弱的,是可以被打破的,因此在一个环上只要把原来的某一个shared_ptr改成weak_ptr,实质上这个环就可以被打破了,原有的环状引用带来的无法析构的问题也就随之得到了解决。

3、四种强制类型转换。

 

你可能感兴趣的:(C++面试基础知识复习系列——二)