C++对象模型分析
阅读《深度探索C++对象模型》做的一些笔记。
Nestler
这个作者很懒,什么都没留下…
展开
-
C++继承模型
在C++继承模型中,一个派生类对象表现出来的东西,是其自己的成员加上其基类成员的总和。但这些成员如何摆放,标准并未强制规定。一般而言,先摆放基类成员,内存向高地址增长。 下面从四个部分讨论C++继承模型: 单一继承不含虚函数单一继承并含虚函数多重继承虚拟继承 1、单一继承不含虚函数 这种继承关系很简单,基类子对象包含在了派生类对象中,在内存中连续存放。但有一点需原创 2014-05-24 08:55:25 · 1813 阅读 · 0 评论 -
数据成员的存取
首先提出一个问题: Foo foo; Foo *pf = &foo; foo.x = 123; pf->x = 123; 这两种存取x成员的方法,有什么区别?答案是要视类Foo和成员变量x的性质而定。下面就来讨论哪些性质决定了上述操作的效率。 1、static数据成员 static数据成员位于对象实例之外,处在初始化数据段中。不管static数据成员位于继承(包括虚继承原创 2014-05-23 15:49:25 · 1115 阅读 · 0 评论 -
虚继承下对象大小的实验
首先看一下实验代码: #include using namespace std; class X {}; class Y : virtual public X {}; class Z : virtual public X {}; class A : public Y, public Z {}; int main() { cout << "size X = " << size原创 2014-05-20 20:54:36 · 967 阅读 · 0 评论 -
复制构造函数的构造操作
和默认构造函数一样,当用户未显式定义复制构造函数时,编译器只有在某些条件下才会合成一个nontrivial的复制构造函数。所以,如果一个类未定义复制构造函数,编译器就自动为它产生出一个,这句话是错误的。下面主要讨论在哪些情况下,编译器才会自动合成一个复制构造函数。 如果有一个如下所示的类: class Foo { public: int x, y; }; 那么编译器不原创 2014-05-19 13:54:27 · 1372 阅读 · 0 评论 -
默认构造函数的构造操作
以下四种情况,编译器将会合成(即由编译器负责)一个nontrivial默认构造函数。 1、成员对象带有默认构造函数 例如: #include using namespace std; class Foo { public: Foo() { cout << "Foo" << endl; } // Foo类含有默认构造函数 }; class Bar { pub原创 2014-05-18 13:36:53 · 1251 阅读 · 0 评论 -
从内存布局看多态性
通过一个实验来说明,代码如下: #include using namespace std; class A { public: int x, y; virtual void func() { cout << "This is A" << endl; } }; class B: public A { public: int z; void func()原创 2014-05-17 16:00:13 · 1049 阅读 · 0 评论 -
C++对象模型
C++对象模型内存布局如下: 非静态数据成员在对象之内静态数据成员在对象之外静态、非静态成员函数在对象之外类中存在虚函数时,一个类对应一个virtual table放在对象之外,对象中安插一个指针vptr指向这个表。 测试例程: #include using namespace std; class A { public: int x, y; static原创 2014-05-16 21:39:02 · 1380 阅读 · 0 评论