`
shi5jin
  • 浏览: 37936 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
社区版块
存档分类
最新评论

为何空类的大小不是零?

阅读更多
为了确保两个不同对象的地址不同,必须如此。也正因为如此,new返回的指针总是指向不同的单个对象。我们还是来看代码吧:
	class Empty { };

void f()
{
Empty a, b;
if (&a == &b) cout << "impossible: report error to compiler supplier";

Empty* p1 = new Empty;
Empty* p2 = new Empty;
if (p1 == p2) cout << "impossible: report error to compiler supplier";
}
 
另外,C++中有一条有趣的规则——空基类并不需要另外一个字节来表示:
	struct X : Empty {
int a;
// ...
};

void f(X* p)
{
void* p1 = p;
void* p2 = &p->a;
if (p1 == p2) cout << "nice: good optimizer";
}
 
如果上述代码中p1和p2相等,那么说明编译器作了优化。这样的优化是安全的,而且非常有用。它允许程序员用空类来表示非常简单的概念,而不需为此付出额外的(空间)代价。一些现代编译器提供了这种“空基类优化”功能。
 
分享到:
评论

相关推荐

    零隐私空白文件生成器v1.0中文绿色版

    零隐私空白文件生成器,以前见过国外有类似的软件,中文的是第一次见,在需要往硬盘或U盘里大量写入数据的时候,这种工具比较有用 它是可以帮助用户生成一个空白或者随机文件中任何可写或者可移动驱动器上的空白文件...

    生成任意大小和格式文件的工具

    这时,一个能够“生成任意大小和格式文件的工具”就显得尤为重要。这个工具无需安装,这意味着它可能是便携式的,可以直接运行而不需要在系统中留下任何痕迹,这对于系统管理员和开发者来说非常方便。 首先,让我们...

    你必须知道的495个C语言问题

    这是为什么? 1.28 文件中的第一个声明就报出奇怪的语法错误,可我看没什么问题。这是为什么? 1.29 为什么我的编译器不允许我定义大数组,如doublearray[256][256]? 命名空间 1.30如何判断哪些标识符可以使用...

    易语言创建大空白文件模块

    文件大小可以通过传入的数值参数设定,生成的文件内容默认为空。 2. **内存缓冲区**:由于直接向大文件写入大量零字节可能会效率低下,因此通常会先在内存中创建一个缓冲区,一次性填充零字节,然后再将缓冲区写入...

    《你必须知道的495个C语言问题》

    这是为什么? 15 1.28 文件中的第一个声明就报出奇怪的语法错误,可我看没什么问题。这是为什么? 15 1.29 为什么我的编译器不允许我定义大数组,如double array[256][256]? 15 命名空间 15 1.30 如何判断...

    Java判断对象是否为空(包括null ,"")的方法

    使用`EmptyUtil`类,你可以简洁地判断任何对象是否为空,而无需关心它具体是什么类型。例如: ```java List&lt;String&gt; list = new ArrayList(); if (EmptyUtil.isEmpty(list)) { System.out.println("列表为空"); } ...

    C语言FAQ 常见问题列表

    o 7.18 当数组是函数的参数时, 为什么 sizeof 不能正确报告数组的大小 ? * 8. 内存分配 o 8.1 为什么这段代码不行?char *answer; printf("Type something:\n"); gets(answer); printf("You typed \"%s\"\n", ...

    C 语言编程常见问题解答.chm

    为什么? 7.13 怎样使用指向函数的指针? 7.14 怎样用指向函数的指针作函数的参数? 7.15 数组的大小可以在程序运行时定义吗? 7.16 用malloc()函数更好还是用calloc()函数更好? 7.17 怎样说明一个大于64KB的...

    空白文件生成器,随机文件生成器,覆盖

    空白文件生成器是一种实用工具,主要用于快速创建零字节或预设大小的空白文件。在IT领域,这种工具有时是必要的,特别是在进行测试、填充存储空间或者作为占位符使用时。下面我们将深入探讨空白文件生成器的工作原理...

    真空吸盘过渡

    在小的(零大小限制)瞬时子和杂散5子之间存在相变。 这种机制从上到下,严格地考虑了具有5个大脑的非摄动真空的频谱和​​模不变性条件。 通过发射和吸收瞬间,它也将我们从一个真空带到另一个真空。 这意味着实际...

    1G长度的空白文件,填充硬盘使用

    1. **空白文件**:空白文件是指不含任何有效数据的文件,其内容通常由空格、制表符或不可见字符组成,但也可以是纯二进制的零。在编程或系统管理中,空白文件有时用于初始化、测试或作为占位符。 2. **文件大小单位...

    行业分类-外包设计-全自动干豆腐真空保鲜包装设备的介绍分析.rar

    同时,设备的灵活性使得它可以适应不同形状和大小的干豆腐产品,为产品多样化提供了可能。 5. 安全与卫生 食品包装设备必须符合严格的卫生标准。全自动干豆腐真空保鲜包装设备的设计注重清洁和易于清洁,减少交叉...

    将一空盒放到电子秤上,将秤的读数调整到零.doc

    作用力和反作用力虽然大小相等,但通常作用在不同物体上,它们做功的代数和不一定为零。 13. 机械能守恒的条件是只有保守力做功,没有非保守力(如摩擦力)做功。 14. 只有当系统不受外力或所有外力的功之和为零,...

    关于量子真空涨落对导电壁附近带电测试粒子的影响的评论

    空空间中电磁场的量子真空波动似乎不会对带电测试粒子的运动产生可观察到的影响。 然而,当实现背景真空状态的改变时,例如当引入导电边界时,可能发生粒子速度的分散。 结果,除了由于粒子和边界之间的相互作用而...

    java 面试题

    为什么? 可以。在Java中,`char`类型使用的是Unicode编码,它能够表示所有常见的字符集,包括中文汉字。每个`char`变量占用2个字节的空间,足以容纳一个汉字。 #### 8\. 用最有效率的方法算出2乘以8等于几? 最...

    Qt用于UDP通信对方停止发送,接收方仍有空报文出现问题

    如果大小为零,说明报文为空,可以忽略或进行特殊处理,而不是将空字符串插入到文本编辑器中。 在开发使用UDP的Qt应用程序时,理解UDP的特性至关重要。由于UDP的不可靠性,需要在代码中加入适当的错误检测和处理...

    动态字符串数组封装的类

    8. **空检查**:提供一个`empty()`函数,判断数组是否为空。 9. **内存效率**:考虑到性能,类的设计应尽可能高效,避免不必要的内存复制和释放。 在“vs2010编译版”中,我们可以推断这个类是为Visual Studio ...

Global site tag (gtag.js) - Google Analytics