我目前正在编写一些网络代码,并且想知道是否有可能获得任意聚合的大小,就像它被紧紧包装一样。
就我而言,类型的大小
struct Header
{
std::int8_t priority = 0;
std::uint16_t sender = 0;
std::uint16_t receiver = 0;
std::uint64_t userSize = 0;
};
由于默认对齐方式,是16个字节。
不幸的是,我尝试使用多态性,但这并没有改变基本类型的对齐方式:
#pragma pack(push, 1)
template <typename T>
struct packed_size_helper : T { };
#pragma pack(pop)
template <typename T>
constexpr std::size_t packed_size = sizeof(packed_size_helper<T>);
基本上,我正在尝试获取容纳Header
的所有成员所需的缓冲区大小。我知道我可以自己打包Header
并使用sizeof(Header)
或对缓冲区大小进行硬编码,因此这个问题主要出于好奇。
答案 0 :(得分:1)
您可以尝试在预先初始化的内存块上使用放置new
。不确定是否可以保证正常工作,但是类似:
char* mem = new char[sizeof(Header)];
std::memset(mem, 0xff, sizeof(Header));
Header* sizer = new (reinterpret_cast<void *>(mem)) Header;
size_t packed_size = 0;
for (char* ptr = mem; ptr < mem + sizeof(Header); ++ptr) {
if (*ptr == 0x00) ++packed_size;
}
delete[] mem;
sizer = nullptr;
很明显,如果允许默认的ctor
覆盖填充,则将无法使用。