《深度探索C++对象模型》笔记

来源:互联网 发布:java随机数生成一样 编辑:程序博客网 时间:2024/05/22 03:42
  1. 虚函数可能会在执行前调整this指针的位置,例如多继承的情况下。基类指针调用子类虚函数,必须调整指针才能访问到正确的成员位置。
  2. 没有任何数据成员及虚函数的类对象,占用空间为1字节。
  3. NRV(named return value)优化可以使程序更少地调用构造与析构函数,减少复制运算。例如对于
    C1 func(){    C1 temp;    return temp;}C1 t = func();
    与void func(C1& c1)函数的调用完全效果一样。

  4. 如果一个临时对象被绑定于一个引用,则对象将残留,直到该引用生命周期结束或直到临时对象的生命范畴结束-视哪一种情况先到达而定。也就是说: C1& c1 = C1(); c1.func(); 能够正确执行,没有任何危险与违规。而如果通过函数返回临时变量的引用,则不受以上条件约束,func()函数将违规访问。
  5. 不要将new到的指针进行基类型转换后用于delete,否则无法正常释放。假设C2继承于C1。则 C1* p = new C2(); delete p; 会导致运行时错误(能正确析构,却无法正确释放内存)。
  6. template的名称决议方式:如果有如下的模板定义情况:
    extern double foo(double);template <class type>class ScopeRules{public:    void invariant() { _member = foo(_val); }    type type_dependent() { return foo(_member); }private:    int _val;    type _member;};
    而在实现的代码中,又出现以下情况:
    extern int foo( int );ScopeRules<int> sr0;
    那么当调用invariant()时,将使用double foo(double)函数,而调用type_dependent()时,会使用int foo(int)。因为_val的类型是int,与模板没有任何关系,所以将选用模板声明处所在的元素可见性。而type_dependent()函数由于使用了_member,与模板参数相关,因此使用模板使用处的元素可见区域。调用最合适的int foo(int)。
    注:在本人的验证过程中,VS2010两个地方均调用了int foo(int),和书本上并不相同。

  7. 模板类中的成员函数并不一定都会生成代码,一般编译器只会生成实际被调用到的函数,其余函数代码完全置之不理,即使里面有语法错误。


原创粉丝点击