如何在课程结束时获取填充的大小

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) == 4sizeof(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。

【讨论】:

以上是关于如何在课程结束时获取填充的大小的主要内容,如果未能解决你的问题,请参考以下文章

Matplotlib:获取子图以填充图形

如何将每次迭代的输出保存到结构中

如何使视图填充所有 LinearLayout 大小

当列表填充数组时,如何在 SwiftUI 中获取列表中元素的索引?

如何填充类实例

如何在另一个快速课程中结束刷新?