C ++ 14 intro.cpp States:
a most derived object shall have a non-zero size and shall occupy one or more bytes of storage
他们为什么要陈述
非零尺寸
和
一个或多个存储字节
什么时候可以有一个而不是另一个?
答案 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