[当我尝试使用__attribute__((packed))
时,g++
会给我有关POD
的警告,但是当我启用gdb
时,包装仍在工作(由__attribute__((packed))
检查)。
如何解决有关std::array
的警告?
代码:
class DataBlock_Offsets {
public:
uint32_t sma_offset;
uint32_t data_offset;
uint32_t string_offset = 0;
uint32_t dict_offset = 0;
};
template<size_t COLUMN_COUNT>
class DataBlock_Header {
public:
uint32_t tuple_count;
uint64_t stop_offset;
std::array<DataBlock_Offsets, COLUMN_COUNT> offsets;
std::array<EncodingType, COLUMN_COUNT> encoding_types;
}
__attribute__((__packed__));
来自g++
的完整警告是(假定模板参数为1:]
warning: ignoring packed attribute because of unpacked non-POD field ‘std::array<imlab::util::DataBlock_Offsets, 1> imlab::util::DataBlock_Header<1>::offsets’
std::array<DataBlock_Offsets, COLUMN_COUNT> offsets;
^~~~~~~
什么使您认为这与std::array
有关?这实际上是关于DataBlock_Offsets
不是POD,这意味着它们都不是std::array
。
具有默认成员初始值设定项的类型不是POD类型,因为其默认构造函数不能无关紧要。 POD类型必须是琐碎的类型。因此,如果您希望这样做,请从DataBlock_Offsets
中删除默认的成员初始化器。或要求打包DataBlock_Offsets
。