Inside the C++ object model
小岛阿飞
简约而不简单
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Data 语意学
class X {};class Y : public virtual X {};class Z : public virtual X {};class A : public virtual Z {};sizeof(X) // result 1sizeof(Y) // result 8sizeof(Z) // result 8sizeof(A) // result 12空的cla...原创 2019-10-20 11:05:44 · 292 阅读 · 0 评论 -
成员们的初始化队伍
必须使用member initialization list的四种情况:当初始化一个reference member时;当初始化一个const member时;当调用一个base class的constructor,而它拥有一组参数时;当调用一个member class的constructor,而它拥有一组参数时。class Word { string _name; ...原创 2019-10-19 18:44:03 · 225 阅读 · 0 评论 -
编译器优化
X bar(){ X xx; //...处理xx return xx;}所有的return指令传回相同的具名数值(xx),因此编译器可能自己做优化,方法是以result参数取代named return value(NRV)。编译器把其中的xx以_result取代:void bar(X& _result) { // default construc...原创 2019-10-17 21:52:23 · 399 阅读 · 0 评论 -
程序员优化
X bar(const T& y, const T& z){ X xx; ... return xx;}那会要求xx被“memberwise”地拷贝到编译器所产生的_result之中,如下。// 可能转换的伪码void bar(X& _result, const T& y, const T& z){ X xx;...原创 2019-10-17 20:35:35 · 308 阅读 · 0 评论 -
程序转化语意学
显示的初始化操作X x0;void foo_bar(){ X x1(x0); X x2 = x0; X x3 = X(x0);}重写每一个定义,其中的初始化操作会被剥除;(“定义”严格来讲是“占用内存”的行为)class 的 copy constructor会被安插进去。// 可能转换的伪码void foo_bar(){ X x1; //定义...原创 2019-10-17 20:09:14 · 205 阅读 · 0 评论 -
Copy Constructor 的构造操作
以一个object的内容作为另一个class object的初值的三种情况:对一个object做显式的初始化操作; class X{};X x; X xx = x;当object被当做参数交给某个函数 extern void foo(X x); void bar() { X xx; foo(xx);…}当函数传回一个class object时 X foo_bar() {X xx; …ret...原创 2019-09-22 20:30:36 · 278 阅读 · 0 评论 -
Bitwise Copy Semantics
Bitwise Copy Semantics (位逐次拷贝)#include "Word.h"Word noun("book");void foo(){ Word verb = noun; ... }如果Word没有定义explicit copy constructor,那么是否会有一个编译器合成的实例被调用?这的看该Word是否展现“bitwise copy ...原创 2019-09-22 16:55:16 · 727 阅读 · 0 评论 -
如果有多个class member objects 都要求constructor初始化操作,将如何?
C++语言要求以“member objects 在class中的声明顺序”来调用各个constructors。这一点由编译器完成,它为每一个constructor安插程序代码,以“member声明顺序”调用呢每一个member所关联的default constructors。这些代码将安插在explicit user code之前。举个例子class Dopey { pulic:Dopey();...原创 2019-09-21 19:45:19 · 228 阅读 · 0 评论 -
Default Constructor 的构造操作
当编译器需要的时候,而不是程序员需要(初始化为0的操作),一个nontrivial default constructor就是编译器所需要的那种,必要的话由编译器合成出来。nontrivial default constructor 的4种情况:1. “带有Default Constructor”的Member Class Object如果一个class 没有任何constructor,...原创 2019-09-21 19:43:35 · 400 阅读 · 0 评论 -
在C++各个不同的编译模块中,编译器如何避免合成出多个default constructor呢?
在C++各个不同的编译模块中,编译器如何避免合成出多个default constructor(比如说一个是为A.C文件合成,另一个是为B.C文件合成)呢?解决方法是把合成的default constructor、copy constructor、destructor、assignment copy operator都以inline方式完成。一个inline函数有静态链接是(static link...原创 2019-09-21 19:40:16 · 201 阅读 · 0 评论 -
C++程序设计模型直接支持三种programming
C++程序设计模型直接支持三种programming程序模型(面向过程):就像C一样,C++当然也支持它;抽象数据类型模型(ADT abstract data type model 如今称之为OB object-based):所谓的“抽象”是和一组表达式(public 接口)一起提供的,那时其运算定义仍然隐而未明。例如string;面向对象模型(OO object-oriented mod...原创 2019-09-21 19:39:02 · 576 阅读 · 0 评论 -
一个class object需要多少内存
其non-static data members的总和大小;加上任何由于alignment的需求而填报padding上去的空间(可能存在于members之间,也可能存在于集合体边界);加上为了支持virtual而由内部产生的任何额外负担overhead。...原创 2019-09-21 19:37:31 · 267 阅读 · 0 评论 -
多态的主要用途
多态的主要用途是经由一个共同的接口来影响类型的封装,这个接口通常被定义在一个抽象的base class中。这个共享接口是以virtual function机制引发的,它可以在执行期根据object的真正类型解析出到底哪一个函数实例被调用。这不只使得“当类型有所增加、修改或删减时,我们的程序代码无须改变”,而且也使一个新的subtype的供应者不需要重新写出“对继承体系中的所有类型都共通”的行为和操...原创 2019-09-21 19:36:50 · 1242 阅读 · 1 评论 -
c++以下列方法支持多态
经由一组隐式的转换操作。例如把一个derived class 指针转化为一个指向其public base type的指针:Shape* ps = new Circle();经由virtual function机制:ps->rotate();经由dynamic_cast 和typeid运算符if (Circle pc = dynamic_cast<Circle>(ps)...原创 2019-09-21 19:34:28 · 221 阅读 · 0 评论 -
C++对象模式
class Point {public: Point(float xval); virtual ~Point(); float x() const; static int PointCount();protected: virtual ostream& print(ostream &os) const; float...原创 2019-09-21 19:30:48 · 321 阅读 · 0 评论 -
加上封装后的布局成本
member function虽然含在每个class object之内,却不出现在object之中。每一个non-inline member function只会诞生一个函数实例。inline function则会在其每一个使用者(模块)身上产生一个函数实例。(函数体的替换)封装并未带来任何空间或执行期的不良后果。C++在布局以及存取时间上的主要的额外负担是由virtual引起的,包括:1...原创 2019-09-21 19:19:20 · 213 阅读 · 0 评论
分享