获得聚合的大小,就好像打包了一样

时间:2019-07-04 09:55:27

标签: c++

我目前正在编写一些网络代码,并且想知道是否有可能获得任意聚合的大小,就像它被紧紧包装一样。

就我而言,类型的大小

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)或对缓冲区大小进行硬编码,因此这个问题主要出于好奇。

1 个答案:

答案 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覆盖填充,则将无法使用。