只要不含有任何虚拟成员函数或者非静态数据变量,空的base类优化可以不为一个继承类的子对象分配任何存储空间而执行这一子对象。在本文中,我将讲述空类的应用和性能的分支。
请看以下的类:
class Base {};
这一类不包含任何直接或间接的虚拟成员函数或者数据成员变量。这一类的对象不会占据任何存储空间,然而,当你使用sizeof()语句时,你将看到它占据至少1个字节(实际占据的空间大小取决于你的执行和编译器设置)。
int n=sizeof(Base); //n must be at least 1
这里,存储空间看起来好象很浪费。当处理这一对象的数组时,占据的空间就会变得很明显:
Base bases[1000000]; // occupies at least 100000 bytes
出现这种情况有一个很好的解释。即将全部对象具有0字节大小就意味着Base实例都处于相同的内存地址空间,实际上这使得这些的对象数组变得无用,因为没有可以使用的方法来访问这些独立的成员。
C++允许对从空base类继承而来的类的存储进行优化。例如,Derived类中的子对象Base具有0字节的大小:
class Derived : public Base
{}; //no storage allocated for Base
空类还可使用于标准模块库(Standard Template Library)。类的开始指定了一个特定的operator new,从而不会在事件失败中发送一个bad_alloc异常:
void * operator new (size_t size, const std::nothrow_t &);
std::nothrow_t is an empty class that's defined as follows:
namespace std
{
struct nothrow_t {};//empty
}
nothrow_t用于执行一条规范,即建立一个独立的不发送的placement new。
你也可以在自己的代码中使用空类来执行各种规范,比如:
struct no_log {};
int backup(); //default backup routine
int backup(const no_log & );//faster backup, used
in special cases