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

标签 c++

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

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

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/

相关文章:

c++ - C++中的单例模式

c++ - 获取 union 成员的数量

android - C++ 生成器 : Include JAR files

c++ - 从成员指针转换为整个结构/类

c++ - 将 char 数组传递给参数化构造函数失败

C++ 算法在条件为真时推进迭代器

c++ - float* 和 vector<float> 的区别

c++ - 使用 Opencv C++ 对循环进行矢量化

c++ - 带有#pragma comment(lib) 的相对路径

c++ - 透视投影中的 3D 场景平移 (OpenGL)