gpt4 book ai didi

c++ - 像打包一样获取聚合的大小

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:02:37 25 4
gpt4 key购买 nike

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

在我的例子中是类型的大小

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com