C++ 循环编译结构的大小减去填充

C++ 循环编译结构的大小减去填充,c++,c++17,boost-hana,C++,C++17,Boost Hana,我也有类似的问题。 我想在编译时获得struct的大小,包括所有未添加编译器特定填充的子结构 struct Bar { BOOST_HANA_DEFINE_STRUCT(Bar, (std::uint8_t, a), (std::uint16_t, b) ); }; struct Foo { BOOST_HANA_DEFINE_STRUCT(Foo, (std::uint8_t, a), (std::uint16_t, b),

我也有类似的问题。 我想在编译时获得struct的大小,包括所有未添加编译器特定填充的子结构

struct Bar {
  BOOST_HANA_DEFINE_STRUCT(Bar,
      (std::uint8_t, a),
      (std::uint16_t, b)
   );
};

struct Foo {
  BOOST_HANA_DEFINE_STRUCT(Foo,
      (std::uint8_t, a),
      (std::uint16_t, b),
      (std::uint32_t, c),
      (std::uint64_t, d),
      (Bar, bar)
    );
};

template <typename T>
constexpr auto bytesize() -> size_t
{
 if constexpr (std::is_arithmetic<T>::value || std::is_enum<T>::value)
    return sizeof(T);
  else if constexpr (std::is_class<T>::value)
  {
    return hana::fold_left(
      hana::accessors<T>(), 0, [](auto total, auto member) {
        // I want to call bytesize recusively here:
        return bytesize<decltype(hana::second(member)(std::declval<T>()))>() + total;
      });
  }  
}

static_assert(bytesize<Foo>() == 18);
结构栏{
BOOST_HANA_DEFINE_STRUCT(Bar,
(标准:uint8_t,a),
(标准:uint16_t,b)
);
};
结构Foo{
BOOST\u HANA\u DEFINE\u STRUCT(Foo,
(标准:uint8_t,a),
(标准:uint16_t,b),
(标准:uint32_t,c),
(标准:uint64_t,d),
(酒吧,酒吧)
);
};
模板
constexpr auto bytesize()->size\u t
{
if constexpr(std::is_算术::value | | std::is_枚举::value)
返回大小f(T);
否则如果constexpr(std::is_class::value)
{
返回hana::向左折叠(
hana::访问器(),0,[](自动总计,自动成员){
//我想在这里反复调用bytesize:
返回bytesize()+总计;
});
}  
}
静态断言(bytesize()==18);
由于我不想包含填充,我希望结构
Foo
的大小为18(包括子结构
条的大小),但链接问题中的代码在计算中包含填充,并给出了19的大小。问题在于函数应该在遇到的所有结构上递归调用bytesize


可以找到一个不按预期工作的最小示例。

结构的大小更大,因为有填充对齐

gcc
clang
上,您可以使用
\uuuuu属性((\uuuu packed\uuuu))

示例

注意,在x86上,压缩结构没有负面影响。至少不可测量

在手臂上,它们也“快速”工作


但是,在其他一些体系结构上,它们可能非常慢,甚至可能“崩溃”CPU。

返回的类型与您期望的不一样(额外的
&&
)<代码>标准::衰减\u t
修复了该问题:

return hana::fold_left(
    hana::accessors<T>(), 0, [](auto total, auto member) {
        using member_type = std::decay_t<decltype(hana::second(member)(std::declval<T>()))>;
        constexpr auto member_size = bytesize<member_type>();

        return total + member_size;
    });
返回hana::向左折叠(
hana::访问器(),0,[](自动总计,自动成员){
使用成员类型=标准::衰减类型;
constexpr auto member_size=bytesize();
返回总数+成员大小;
});

最简单的示例不是获取结构的大小。它是关于断言一个特定的大小。@idclev463035818检查函数
bytesize
中注释掉的部分,这是不起作用的部分没有函数bytesize,请将代码包括在问题中您期望的结果是什么?您得到的输出是什么?请花些时间来,读,读,以及。顺便说一下,你知道我绝对知道填充,这就是为什么我使用boost::hana循环结构的成员,并分别获得成员的大小。我不希望taskWell依赖于某些特定于编译器的属性。如果你把它打包,它就会工作。这可能是Hana相关的吗?等等,它现在编译了。你修好了吗?2*1Byte+2*2Byte+4Byte+8Byte=18ByteI知道,但我认为宏添加了不可见成员谢谢你的解决方案!
return hana::fold_left(
    hana::accessors<T>(), 0, [](auto total, auto member) {
        using member_type = std::decay_t<decltype(hana::second(member)(std::declval<T>()))>;
        constexpr auto member_size = bytesize<member_type>();

        return total + member_size;
    });