我目前正在编写一些网络代码,想知道是否有可能获得任意聚合的大小,就好像它是紧密打包的一样。
在我的例子中是类型的大小
struct Header
{
std::int8_t priority = 0;
std::uint16_t sender = 0;
std::uint16_t receiver = 0;
std::uint64_t userSize = 0;
};
是16字节,因为默认对齐。
我尝试过使用多态性,但不幸的是,这并没有改 rebase 类型的对齐方式:
#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)
或硬编码缓冲区大小,所以这个问题主要是出于好奇。
最佳答案
您可以尝试在预初始化内存块上使用放置 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
覆盖填充,这将不起作用。
关于c++ - 像打包一样获取聚合的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56885348/