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

本文探讨了C++中虚函数的工作原理、this指针调整、NRV优化等高级特性,并介绍了临时对象引用绑定、模板成员函数代码生成规则等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值