1
. 内存管理函数的层次
从下图中可以看到,C++
程序员处于的位置是最上层的Applications
,用的最多的是new
,new[]
,如果用容器,则内存基本不用管理。其次也可以调用malloc
。至于最底层的操作系统级别的API
,没有可移植性。它们之间的调用关系如上图的箭头所示。
5
章:构造、析构、拷贝语意学可以定义和调用一个纯虚函数,不过只能被静态的调用(通过类作用域运算符),不能通过虚拟机制调用。
你声明了一个纯虚析构函数,就必须定义它。因为在你提供了声明前提下,每一个derived class destructor会被编译器加以扩展,以静态调用的方式调用其“每一个virtual base class”以及“上一层base class”的destructor。因此,只要缺乏任何一个base class destructor的定义,就会导致链接失败。
读到这儿,你可能会有疑问,对于普通的类(没有虚机制参与进来,派生类的析构函数中也会逐一调用基类的析构函数)我们也没有提供它析构函数的,那为什么不会导致链接失败呢?这是因为你没有写析构函数,编译器会默默给你提供一个,以便于在后面的派生类的析构函数中调用它。这里的重点是你没有提供,也就是说你没有声明,如果你声明了,但没有提供定义,同样会导致链接失败。
对于基类该不该将虚函数定义为const
的,作者不建议。因为derived class中可能会修改自己的数据成员。
有没有感觉到自己的电脑桌面一成不变让人厌倦?虽然有一些诸如360桌面之类的软件可以使用,但弹窗、广告又太多!本文就教你用 python 实现一个简洁清爽的桌面壁纸定时更换工具。
这里将要介绍的是一种在Linux
平台实现的划词翻译工具,当然在考虑自己实现一个如此功能的工具前,我也是在网上搜索了一些在Linux
平台实现的类似的开源工具,例如 pdfTranslator,popup-dict,但它们的安装和配置都显得比较麻烦,而且使用起来也并不方便。
我实现这个工具的初衷本是方便自己看一些英文文献和书籍的,极为方便,考虑到分享出去可以让更多人受惠,因此这里详细介绍一下它的实现步骤。
3
章:Data
语意学The size of class
1 | class X |
一个类的大小主要受三个因素的影响:
语言支持的特性所造成的负担
比如,含虚函数的类会额外多一个vptr
指针,含virtual base class
会再多一个额外的指针(它或者指向virtual base class subobject
,或者指向一个相关表格;表格中存放的若不是virtual base class subobject
地址,就是其偏移量)。
编译器对于特殊情况所提供的优化处理
现代编译器的对于空基类的优化处理:一个empty virtual base class
被视为derived class object
最开头的一部分,也就是说它并没有花费任何的额外空间。因为既然有了members
,就不需要原本为了empty class
而安插的一个char
。
alignment
(内存对齐)
就是将数值调整到某数的整数倍。在64
位计算机上,通常alignment
为8 bytes
,以使bus
的“运输量”达到最高效率。
Simplifier
是编译器的一部分,处于type checking
和code generation
之间。它用来转换内部的程序表现。有3
种转换是任何对象模型都需要的:
与编译器息息相关的转换(Implementation-dependent transformations
)
例如,当parser
看到这个表达式:
1 | fct(); |
它并不知道是否(a
)这是一个函数调用操作,或者(b
)这是overloaded calloperator
在class object fct
上的一种应用。默认情况下,这个式子所代表的是一个函数调用,但是当(b
)的情况出现,Simplifier
就要重写并调换call subtree
。
语言语意转换(Language semantics transformations
)
这包括constructor
/destructor
的合成和扩展、memberwise
初始化、对于memberwise copy
的支持、在程序代码中安插conversion operators
、临时性对象,以及对constructor
/destructor
的调用。
程序代码和对象模型的转换(Code and object model transformations
)
这包括对virtual functions
、virtual base class
和inheritance
的一般支持、new
和delete
运算符、class objects
所组成的数组、local static class instances
、带有非常量表达式(nonconstant cxpression
)之global object
的静态初始化操作。
什么是C++
对象模型?