C++POD结构继承?是否对派生成员的内存布局有任何保证?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (24)

比方说,我有一个struct RGB和我想创建struct RGBA,它继承RGB

struct RGB {
    unsigned char r;
    unsigned char g;
    unsigned char b;
};

struct RGBA: RGB {
    unsigned char a;
};

两者都将用于读取未压缩的图像数据:

RGBA *pixel=static_cast<RGBA *>(image->uncompressed_data);

问:关于内存布局,这是否安全struct RGBA?有谁保证,那:

  • unsigned char a之后RGB struct(不是之前)
  • 之间没有填充struct RGB和从一个参数struct RGBA

会有#pragma pack帮助吗?这是关于继承期间的内存布局。

提问于
用户回答回答于

有关派生成员的内存布局保障和演员是不是安全的。

因为你有继承,也可能有填充,这不是微不足道的。

§9类

1 POD struct109是一个类,它既是一个普通类又是一个标准布局类,并且没有类型非POD结构,非POD联合(或这种类型的数组)的非静态数据成员。同样,POD联盟既是一个普通的类,也是一个标准的布局类,

另外std::is_pod<RGBA>是不是一个POD

std::cout << std::boolalpha;
std::cout << std::is_pod<RGBA>::value << '\n';

结果是错误的。

用户回答回答于

不,布局不能保证。唯一的保证是标准布局类; 而这样一个阶级的条件之一就是它

在大多数派生类中最多没有非静态数据成员,最多只有一个基类具有非静态数据成员,或者没有包含非静态数据成员的基类

换句话说,所有数据成员必须在同一个类中,而不能超过一个。

扫码关注云+社区