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

Nuc*_*ear 25 c++ inheritance pod

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

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

struct RGBA: RGB {
    unsigned char a;
};
Run Code Online (Sandbox Code Playgroud)

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

RGBA *pixel=static_cast<RGBA *>(image->uncompressed_data);
Run Code Online (Sandbox Code Playgroud)

问题:关于内存布局,这样安全struct RGBA吗?有人保证:

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

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

Mik*_*our 15

不,布局不保证.唯一的保证是标准布局类; 这类课程的一个条件就是它

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

换句话说,所有数据成员必须位于同一个类中,而不是多个.


bil*_*llz 9

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

由于你有继承,也可能有填充,这不是微不足道的.

§9类

1 POD struct109是一个既简单类又是标准布局类的类,并且没有非POD结构类型的非静态数据成员,非POD联合(或此类类型的数组).类似地,POD联合是一个既简单的类又是标准的布局类的联合,并且没有非

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

std::cout << std::boolalpha;
std::cout << std::is_pod<RGBA>::value << '\n';
Run Code Online (Sandbox Code Playgroud)

结果是假的.看现场演示