C++ Object Model
Nestler
这个作者很懒,什么都没留下…
展开
-
从内存布局看多态性
通过一个实验来说明,代码如下:#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 · 1073 阅读 · 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 · 984 阅读 · 0 评论 -
C++对象模型
C++对象模型内存布局如下:非静态数据成员在对象之内静态数据成员在对象之外静态、非静态成员函数在对象之外类中存在虚函数时,一个类对应一个virtual table放在对象之外,对象中安插一个指针vptr指向这个表。测试例程:#include using namespace std; class A {public: int x, y; static原创 2014-05-16 21:39:02 · 1400 阅读 · 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 · 1129 阅读 · 0 评论 -
默认构造函数的构造操作
以下四种情况,编译器将会合成(即由编译器负责)一个nontrivial默认构造函数。1、成员对象带有默认构造函数例如:#include using namespace std; class Foo {public: Foo() { cout << "Foo" << endl; } // Foo类含有默认构造函数}; class Bar {pub原创 2014-05-18 13:36:53 · 1270 阅读 · 0 评论 -
复制构造函数的构造操作
和默认构造函数一样,当用户未显式定义复制构造函数时,编译器只有在某些条件下才会合成一个nontrivial的复制构造函数。所以,如果一个类未定义复制构造函数,编译器就自动为它产生出一个,这句话是错误的。下面主要讨论在哪些情况下,编译器才会自动合成一个复制构造函数。如果有一个如下所示的类:class Foo {public: int x, y;};那么编译器不原创 2014-05-19 13:54:27 · 1392 阅读 · 0 评论 -
C++继承模型
在C++继承模型中,一个派生类对象表现出来的东西,是其自己的成员加上其基类成员的总和。但这些成员如何摆放,标准并未强制规定。一般而言,先摆放基类成员,内存向高地址增长。下面从四个部分讨论C++继承模型:单一继承不含虚函数单一继承并含虚函数多重继承虚拟继承1、单一继承不含虚函数这种继承关系很简单,基类子对象包含在了派生类对象中,在内存中连续存放。但有一点需原创 2014-05-24 08:55:25 · 1834 阅读 · 0 评论