【发布时间】:2023-04-10 09:08:01
【问题描述】:
问题:
考虑以下类型:
struct S {
std::uint8_t a;
std::uint32_t b;
};
是否可以单独从std::uint8_t 和std::uint32_t 确定sizeof(S)?
上下文:
我正在开发一个代码,其中S 实际上是一个模板类型,比这个用于说明目的的模板类型更详细,所以我想在定义一个特征类时从它的数据成员的类型中通用地确定一个类型的大小.到目前为止,我有两个想法:
- 使用数据成员的对齐方式
template <typename... Ts>
inline constexpr std::size_t aligned_sizeof_all_v = sizeof...(Ts) * std::max(alignof(Ts)...);
- 使用
std::tuple
template <typename... Ts>
inline constexpr std::size_t aligned_sizeof_all_v = sizeof(std::tuple<Ts...>);
使用这两种方法似乎都成功了,虽然我不太愿意使用第二种方法,因为std::tuple 的实现不能保证它的大小:
static_assert(aligned_sizeof_all_v<std::uint8_t, std::uint32_t> == sizeof(S));
这是确定类型大小的正确方法吗?
【问题讨论】:
-
当你可以问
sizeof给你类的大小时,为什么你需要从它的成员中确定类的大小?除了知道班级的规模之外,别无他法。 -
通常您无法知道尺寸是多少。一旦涉及到虚函数,情况就更是如此。 C++ 已经有很多关于函数推导的东西,所以你最好问一下。
-
用你的
aligned_sizeof_all_v试试struct S { uint8_t a, b; std::uint32_t c; };。我认为它不会提供正确的尺寸。 -
@SepiaColor 它对我不起作用:godbolt.org/z/S3wjkz。或者,我没有正确理解您的问题。我在这种情况下看到的问题是
aligned_sizeof_all_v是“对称的”,而结构的大小可能取决于其成员的顺序。
标签: c++ sizeof typetraits memory-alignment stdtuple