`
shi5jin
  • 浏览: 37256 次
  • 性别: 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如何判断哪些标识符可以使用...

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

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

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

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

    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的...

    真空吸盘过渡

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

    C语言编程要点

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

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

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

    emptyStruct:创建各种类型的空结构数组-matlab开发

    S 具有字段和非零大小,但每个元素都是一个空矩阵。 严格地说,S 不是空的,因为空矩阵是它的内容,但这有时是一个有用的结构。 上述每种“空”结构数组都可以用作初始化。 它们都可以使用 STRUCT 创建,但如何...

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

    老资源。 目录 1 声明和初始化1 1.1 我如何决定使用那种整数类型? . . . .... ....5.11 为什么有那么多关于空指针的疑惑?为什么这些问题如此经常地 出现? . . . . . . . . . . . . . . . . . . . ...

    论文研究 - 平面空间宇宙学作为光速宇宙膨胀的模型—对真空能量密度的影响

    宇宙学家长期以来一直忽略量子场论者的规定,即对应于零态真空能的真空压力p的大小必须始终等于真空能密度ρ(即p =ρ)。 尽管广义相对论规定了真空引力场与(ρ+ 3p)之间成比例的附加条件,但宇宙真空的状态方程...

    瞬时真空模型中的动态胶子质量

    使用平均瞬时大小size = 1/3 fm和平均瞬时距离R = 1 fm的典型现象学值,我们得到Ms(0)= 256 MeV。 然后,我们将这种方法扩展到经过认真考虑的零模的实矢量胶子。 我们获得以下表达式Mg2(q)= 2Ms2(q)。 瞬子...

    Yang-Mills-Higgs模型中具有非零Hopf不变性的拓扑缺陷

    我们针对3 + 1D非阿贝尔规范理论和标量场提出了具有非零Hopf不变性的拓扑缺陷或瞬时解。 我们将这种解决方案称为Hopf缺陷,它代表一个时空事件,该事件使单极真空歧管旋转2π。 尽管此Hopf缺陷的作用在对数上是发散...

    Java测试题2答案

    如果下列的方法能够正常运行,在控制台上将显示什么? ACD &lt;br&gt;public void example(){  try{  unsafe();  System.out.println("Test1");  }  catch(SafeException e)  {System.out....

    生成验证码控件

    EnableClientValidate:是否使用客户端脚本验证,验证内容包括是否为空、长度是否正确 ImageStyle:验证码图像样式 其中ImageStyle为复类属性,其公开属性如下: ImageStyle.ImgBgColor:图片背景色 ImageStyle....

Global site tag (gtag.js) - Google Analytics