c++ data语意学】的更多相关文章

一个空的class:如 class X{} ; sizeof(X)==1; sizeof为什么为1,他有一个隐晦的1 byte,那是被编译器安插进去的一个char,这使得class2的两个objects得以在内存中配置独一无二的地址: X a,b; if(&a==&b) cerr<<"yipes!"<<endl; class X{}; class Y:public virtual X{}; class Z:public virtual X{};…
引例: class X{}; class Y:public virtual X{}; class Z:public virtual X{}; class A:public Y,public Z{}; X Y Z A类对象的大小是多少??  1> 没有提供empty virtual base特殊支持的编译器:1 8 8 12 2> 提供了empty virtual base特殊支持的编译器:1 4 4 8       一个class的data members,一般而言,可以表现这个class在程…
 Data Member的绑定 extern float x; class Point3d { public: point3d(); //问题:被传回和被设定的x是哪一个x呢? float X() const { return x; } private: float x, y, z;//Point3d::X()将返回内部的x. }; 在早期(2.0之前)C++的编译器上,将会指向global x object, 导致C++的两种防御性程序设计风格:                1.把所有的da…
Data Member的绑定 inline member functin躯体之内的一个data member绑定操作会在整个class声明完成之后才发生. argument list中的名称还是会在它们第一次遭遇时被适当地决议. 为避免错误,早期出现三种防御性代码风格,把data members放在class声明开始处,把inline functions放在class声明之外,把nested type声明放在class的起始处. Data Member的布局 static data member…
在C++中经常会遇到一个类的大小问题,关于一个类的大小一般受到三个方面的影响. 语言本身所造成的额外负担,如在虚拟继承中会遇到如派生类中会包含一个指针指向base class subobjec,这样会造成内存的额外负担. 编译器对于特殊情况所提供的的优化.如果编译器不提供优化,则会在一个空的基类中会形成至少一个char类型的内存空间,传统上这一个char类型的空间会被放在该类内存的固定尾部,但是有些编译器会提供优化的策略,在空类型中不会生成这一个char成员对象的空间. Alignment的限制…
1. 一个空类的大小是1 byte.这是为了让这一类的两个对象得以在内存中配置独一无二的地址. 2. Nonstatic data member 放置的是“个别的class object”感兴趣的数据,static data members则放置的是“整个class”感兴趣的数据. 3. C++对象模型把nonstatic data members直接放在每一个classs object之中.对于继承而来的nonstatic data members(不管是virtual 还是nonvirtua…
Data语意学 class X{}; class Y : publicvirtual X {}; class Z : publicvirtual X {}; class A : publicY, public Z {}; sizeof(X) = 1,sizeof(Y) = 4, sizeof(Z) = 4, sizeof(A) = 8.visualc++6.0上測试结果(对emptyvirtual base class 有特殊处理的编译器) 反之则相应的结果为1.8.8,12 其实Y,Z的大小受…
一. 关于对象 1.内联函数:能够除去函数调用的开支,每一处内联函数的调用都是代码的复制.这是一种空间换取时间的做法,若函数代码量大或者有循环的情况下,不宜内联(这件事有些编译器会自动帮你做).在类中若直接将函数实现写在类体内,默认内联.如果函数因其复杂度或构建等问题被判断为不能成为inline函数,它将被转化为一个static函数.如果一个inline函数被调用太多次的话,会产生大量的扩展码,使程序大小暴涨. 2.C++对象模型: 3.组合,而非继承是把C和C++结合的唯一可行方法. 4.C+…
转载:http://dsqiu.iteye.com/blog/1669614 第一章 关于对象 使用class封装之后的布局成本: class并没有增加成本,data members直接内含在每一个class object之中,就像C struct一样.而member functions虽然被包含在class的声明之内,但是不出现在Object之中.每一个non-inline function 只会产生一个函数实体.至于inline function则会在每一个调用使用的地方产生一个函数实体(在…
C++对象模型: 多重继承模型示意: 第二章:构造函数 语意学 基类和派生类: Bear yogi; ZooAnimal franny=yogi; 在这里,很容易理解合成的copy构造函数将vptr指向基类的虚函数表,不然不仅造成数据切割(sliced),函数调用也混乱了. 返回值的初始化: 在下述四种情况下必须使用成员初始化列表: 上面的产生临时string效率很低,修改后可以提高: 在构造函数中可以使用成员函数来对数据成员进行初始化: 这是因为(可以在构造函数中使用成员函数的原因): 简单来…