Inside The C++ Object Model(一)

============================================================================
1-1. 关键字struct和class的一点区别:
(1)struct内部默认public属性,class内部成员默认private属性;
(2)template中只能使用class来抽象类型参数,不能使用struct,template并不打算和C兼容。

1-2. C程序员有时会把单一元素的数组放在一个struct的尾端,于是每个struct objects可以拥有可变大小的数组。

struct memble{
/* */
char pc[1];
};

在这里,如果我们改用class来声明,则可能不行。C++中凡处于同一个access section的数据,必定保证以其声明次序出现在内存布局当中。然而被放置在多个access sections(public,protected,private)中的各笔数据,排列次序就不一定了。同样道理,base classes和derived classes的data members的布局也没有谁先谁后的强制规定,因而也就不能保证前述的C伎俩一定有效。Virtual functions的存在也会使前述伎俩的有效性成为一个问号。最好的忠告就是:不要那么做。

class stumble{
public:
// operations ...
protected:
// protected stuff
private:
/*private stuff*/
char pc[1];
};

注:组合,而非继承,才是把C和C++结合在一起的唯一可行方法。C struct在C++中的一个合理用途,是当你要传递“一个复杂的class object的全部或部分”到某个C函数中去时,struct声明可以将数据封装起来,并保证拥有与C兼容的空间布局。然而这项保证只在组合的情况下才存在。如果是“继承”而不是“组合”,编译器会决定是否应该有额外的data members被安插到base struct subobject之中。

============================================================================
1-3. 你可以直接或间接处理继承体系中的一个base class object,但只有通过pointer或reference的间接处理,才支持OO程序设计所需要的多态性质。如下:

// 描述objects:不确定类型
Library_materials *px = retrieve_some_material();
Library_materials &rx = *px;
// 描述已知物:不可能有令人惊讶的结果产生
Library_materials dx = *px;

你没有办法确定地说出px或rx到底指向何种类型的objects,你只能够说它要不就是Library_materials object,要不就是后者的一个子类型(subtype)。不过,我们倒是可以确定,dx只能是Library_materials class的一个objects。

============================================================================
1-4. C++对象模型(内存布局)

============================================================================

时间: 2024-08-02 07:03:12

Inside The C++ Object Model(一)的相关文章

Inside the C++ Object Model | Object Lessons

1. 加了封装后的布局存取成本(Layout Costs for Adding Encapsulation) 虚函数机制:用于支持有效率的执行期绑定 虚基类机制:实现在继承中避免重复继承. 2. The C++ Object Model pointer-to-member:避免了成员类型不同所需空间不同的问题,对象的成员是以 slot 的索引值来寻址 data member table: member function table: virtual table(vtbl):每个对象有一个指针指(

inside the C++ Object model总结

一. 关于对象 1.内联函数:能够除去函数调用的开支,每一处内联函数的调用都是代码的复制.这是一种空间换取时间的做法,若函数代码量大或者有循环的情况下,不宜内联(这件事有些编译器会自动帮你做).在类中若直接将函数实现写在类体内,默认内联.如果函数因其复杂度或构建等问题被判断为不能成为inline函数,它将被转化为一个static函数.如果一个inline函数被调用太多次的话,会产生大量的扩展码,使程序大小暴涨. 2.C++对象模型: 3.组合,而非继承是把C和C++结合的唯一可行方法. 4.C+

Inside The C++ Object Model(三)

============================================================================3-0. 类所占的内存大小受到三个因素的影响:(1)语言本身所造成的额外负担(Virtual base classes):(2)编译器对于特殊情况所提供的优化处理(空基类优化):(3)Alignment的限制(对齐):注:Empty Virtual base class提供一个Virtual interface,没有定义任何数据,某些编译器对此提

Inside The C++ Object Model(四)

============================================================================4-1. Member 的各种调用方式静态成员函数(static member functions,不属于对象,没有this指针)不能直接存取Nonstatic数据:同时不能被声明为const(const用于后置修饰函数时只用于限定成员函数,意味着将被修饰的成员函数的隐式参数--this指针由原来的Class* const变为const Clas

Inside The C++ Object Model(二)

============================================================================2-0. 关键字explicit被引入C++,提供给程序员一种方法,使他们能够制止"单一参数的constructor"被当做一个conversion运算符. ============================================================================2-1.Default Co

Inside The C++ Object Model(五)

============================================================================5-0. 一般而言,class 的data member 应该被初始化,并且只在constructor中是在class 的其他member functions 中指定初值.其他任何操作都将破坏封装性质,是class 的维护和修改更加困难. 图片5-0: (1)纯虚拟函数的存在注:编译器不会在扩展derived class 的destructor时

重温《Inside The C++ Object Model》(2) --Default-Constructor的建构操作

//constructor/non-constructor的区别 class Foo { public: //Foo():val(0),next(NULL) {} int val; Foo *next; }; void foo_bar() { Foo bar; if ( bar.val && bar.next ) { cout << bar.val << endl; printf("%p\n", bar.next); cout <<

重温《Inside The C++ Object Model》(1) --关于对象

C/C++ 编程风格 //1.C风格(结构化程序设计):数据和函数(操作)没有任何关联性 typedef struct Point3d { float x; float y; float z; } Point3d_t; void Point3d_print(const Point3d_t *pd) { printf("%g, %g, %g\n", pd->x, pd->y, pd->z); } //2.基于对象(Object-Base):提供抽象数据类型(ADT)来支

《深度探索C++对象模型(Inside The C++ Object Model )》学习笔记

转载:http://dsqiu.iteye.com/blog/1669614 第一章 关于对象 使用class封装之后的布局成本: class并没有增加成本,data members直接内含在每一个class object之中,就像C struct一样.而member functions虽然被包含在class的声明之内,但是不出现在Object之中.每一个non-inline function 只会产生一个函数实体.至于inline function则会在每一个调用使用的地方产生一个函数实体(在