什么时候对象既可以有非零大小,又可以有一个或多个存储字节?

时间:2017-07-16 06:25:19

标签: c++ language-lawyer

C ++ 14 intro.cpp States:

a most derived object shall have a non-zero size and shall occupy one or more bytes of storage

他们为什么要陈述

  

非零尺寸

  

一个或多个存储字节

什么时候可以有一个而不是另一个?

2 个答案:

答案 0 :(得分:4)

这两部分实际上说的是不同的东西。

  

最派生的对象应具有非零大小

这意味着使用对象的sizeof将返回非零大小。

  

最派生的对象......应占用一个或多个存储字节

这意味着对象占用了一些字节(一个或多个)的内存。

如果第二个语句不存在,则可能意味着sizeof将报告非零大小,但该对象可能实际上不使用任何内存。

如果没有第一个语句,它可能意味着sizeof可能返回零,但对象仍会占用内存中的空间。

两者都需要并且彼此正交。

答案 1 :(得分:3)

在某些情况下,某个类可能具有非零大小(由sizeof返回),但它实际上并不占用内存中的任何空间。例如,Empty Base Optimization (EBO)用于使派生对象的基础部分在内存中不占用空间,如下例所示:

#include <stdio.h>

struct Base {};

struct Derived : Base
{
    int a;
};

int main()
{
    printf("sizeof(Base) = %d\n", sizeof(Base));

    Derived* p = new Derived;
    void* p1 = p;
    void* p2 = &p->a;

    if(p1 == p2) { printf("Good compiler\n"); }

    return 0;
}

在Ubuntu 14.04 x64上使用gcc 4.8.4编译。

输出:

sizeof(Base) = 1
Good compiler