如何在课程结束时获取填充的大小
Posted
技术标签:
【中文标题】如何在课程结束时获取填充的大小【英文标题】:how to get the size of the padding at the end of a class 【发布时间】:2017-12-10 13:34:31 【问题描述】:我有这样的 A 类:
struct V
virtual void f() = 0;
;
struct A
int data;
;
struct B : public A , public V
void f() override
;
MSVC 在 64 位构建而不是 12 位 (sizeof(void*) + sizeof(A)
) 上为我提供 sizeof(A) == 4
和 sizeof(B) == 16
- 所以有 4 字节填充。有没有办法得到那个填充?也许有一些特质?
我需要这个的原因是做这样的断言:
static_assert(sizeof(B) == sizeof(A) + std::is_polymorphic<camera>::value * sizeof(void*));
意思是我要确保所有数据都在基类中,但是 B 应该能够通过从某个接口继承来实现多态... 不应将新成员添加到 B 但应该允许它是多态的.如果我在 A
中有 2 个整数,那么在 B
的末尾会有 0 个填充...
【问题讨论】:
"f 我在 A 中有 2 个整数,在 B 的末尾会有 0 个填充。" - C++ 不做这样的保证。 没有获得填充的特征。此外,标准未指定填充的位置和大小。您对该断言的需求是可疑的,并让我相信您正在尝试做一些标准也没有定义的事情。你能详细说明你的目标吗? 您可以使用alignof(B)
自行计算。
@BrianRodriguez 对齐不是确定填充的唯一因素。
我明白了,那么这个问题的答案是否定的:***.com/questions/5397447/struct-padding-in-c
【参考方案1】:
我找到了一个似乎适用于 GCC 和 clang 的解决方案,至少对于您给出的示例而言。
namespace detail
template <typename T, int N>
struct add_padding : add_padding<T, N - 1>
char pad;
;
template <typename T>
struct add_padding<T, 0> : T
;
// namespace detail
template <typename T, int N = 1, bool = (sizeof(T) == sizeof(detail::add_padding<T, N>))>
struct padding_size
static constexpr int value = padding_size<T, N + 1>::value;
;
template <typename T, int N>
struct padding_size<T, N, false>
static constexpr int value = N - 1;
;
对于不是从不同大小的类型继承引起的填充,它会中断,并且它根本不适用于 MSVC。因此,恐怕这并不是您问题的真正答案,但也许它可以帮助其他人。这是live example。
【讨论】:
以上是关于如何在课程结束时获取填充的大小的主要内容,如果未能解决你的问题,请参考以下文章