探究空类(empty class)的应用和性能分支

ZDNet软件频道 时间:2004-02-04 作者:ZDNet China |  我要评论()
本文关键词:
只要不含有任何虚拟成员函数或者非静态数据变量,空的base类优化可以不为一个继承类的子对象分配任何存储空间而执行这一子对象。在本文中,我将讲述空类的应用和性能的分支。
本文译自Builder.com,未经许可请勿转载

只要不含有任何虚拟成员函数或者非静态数据变量,空的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

 


本文作者:Danny Kalev是具有14年经验的系统分析员和软件工程师,他主要专长于C++和面象对象程序设计。


责任编辑:李宁

欢迎评论投稿

百度大联盟认证黄金会员Copyright© 1997- CNET Networks 版权所有。 ZDNet 是CNET Networks公司注册服务商标。
中华人民共和国电信与信息服务业务经营许可证编号:京ICP证010391号 京ICP备09041801号-159
京公网安备:1101082134