一个对象什么时候可以有非零大小的一个,但不能同时具有一个或多个字节的存储

When can an object have either but not both of non zero size , one or more bytes of storage?

本文关键字:但不能 具有一 有一个 存储 字节 一个 一个对象 什么时候      更新时间:2023-10-16

C++ 14 个介绍.cpp 状态:

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

他们为什么要声明

非零大小

一个或多个字节的存储空间

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

这两个部分实际上是在说不同的事情。

大多数派生对象应具有非零大小

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

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

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

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

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

两者都是必需的,并且彼此正交。

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

#include <stdio.h>
struct Base {};
struct Derived : Base
{
int a;
};
int main()
{
printf("sizeof(Base) = %dn", sizeof(Base));
Derived* p = new Derived;
void* p1 = p;
void* p2 = &p->a;
if(p1 == p2) { printf("Good compilern"); }
return 0;
}

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

输出:

sizeof(Base) = 1
Good compiler
相关文章: