C++-----深度探索C++对象模型-第六章-执行期语意学

1、C++是一个不太容易从程序源码上看出表达式的复杂程度。其中会有很多的临时生成物。

2、一般而言,最好把对象尽可能放在使用它的那个程序区段附近,这么做可以节省非必要的对象产生操作和摧毁操作。如果一个区段的函数有一个以上的离开点,析构函数会被放在每一个离开点。

3、对全局对象而言,C++一定会在main函数中第一次调用对象之前把对象构造出来,而在main结束之前把对象摧毁掉。全局对象放在数据段(存放已初始化的全局对象)。

4、如果全局对象没有显式的指定初值,那么该对象所配置的内存内容为0。这和C不同,C并不会自动设定初值。所以C中没有初始化的全局变量存放在.bss段。虽然类对象在编译时期可以被放置于数据段并且内容为0,但是构造函数一直到程序启动才会实施。

5、C++中建议不要使用需要静态初始化的全局对象。

6、局部静态对象:其构造函数只会被施行一次,哪怕这个函数被调用多次。其析构函数必须只会执行一次,哪怕该函数被调用多次。

7、对于局部静态对象而言,只有在包含其函数被调用时才会构造器对象。

8、对象数组:其编译器实现更复杂,尽量不要使用。

9、new运算符,其实是通过两个步骤完成的:先通过适当的new运算符函数实例配置所需的内存。再将配置来的对象设立初值。再细化一点,在进行完第一步之后,还应该检查内存是否配置成功,成功之后才设立初值。

10、对于delete,如果指针值为0,那么C++会要求delete不要有操作,因此编译器会为此调用构造一层保护检查指针是否为0。

11、new得到的指针所指的对象的生命会在delete之后结束,后续对该指针的操作不再保证有良好的行为,但是把它当成一个指针来用仍然是可以的。也就是说,虽然该指针指向的对象已经不合法了,但是地址本身仍然是一个合法的程序空间。

12、new运算符实际上是由C的malloc完成的,delete其实也是free实现的。

13、C++要求new必须返回一个独一无二的指针,但是如果传入的size是0的话,解决方法是返回一个指针,指向一个默认一字节的内存区块。

14、最好避免以一个基类指针指向一个派生类所组成的指针。如果非要这样写,那么应该走过整个数组将delete运算符实施与每一个元素身上。

15、是否产生一个临时对象:视编译器的进取性和操作发生的程序语境,此外还要看operator+()和NRV优化。

16、C++标准并没有用对临时对象的产生做出规定。

17、临时对象的被摧毁应该是对完整表达式求值过程中的最后一个步骤。

18、凡是持有表达式执行结果的临时对象应该存六道对象的初始化操作完成为止。

19、如果一个临时性对象被绑定于一个引用,对象将残留,直到被初始化的引用生命结束,或直到临时对象的生命范畴结束。

posted @ 2019-06-03 10:57  吾之求索  阅读(148)  评论(0)    收藏  举报