【发布时间】:2014-04-19 17:02:45
【问题描述】:
假设我有一个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的a 参数之间没有填充?
#pragma pack 会帮忙吗?这都是关于继承期间的内存布局。
【问题讨论】:
-
标准中不保证
r和g之间没有填充。标准中也没有保证RGBA所需的对齐方式。因此,即使不必回答您提出的实际问题,这也不安全。 -
只需创建一个带有布尔值的 RGBA 类,它指示是否使用 Alpha 通道。
-
你还需要考虑字节序。只需编写执行所需按位操作的打包/解包函数,您就可以省去很多麻烦。
标签: c++ inheritance