如何在类结束时获取填充的大小
how to get the size of the padding at the end of a class
>我有一个这样的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 个填充......
我找到了一个似乎适用于 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。所以恐怕这不是你问题的答案,但也许它可以帮助其他人。这是一个活生生的例子。
相关文章:
- C++为构建时间获取QDateTime的可靠方法
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 如何使用 < 和 > 命令获取 c++ 中的输入和输出?
- 在c++中用vector填充一个简单的动态数组
- 使用指针从C++中的数组中获取最大值
- 如何获取std::result_of函数的返回类型
- 如何在openssl-ecc中获取十六进制格式的私钥
- 使用Unreal C++获取VR耳机的世界位置/方向
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 如何使用用户输入在C++中正确填充2D数组
- 从C字符串中获取奇怪的字符串长度
- 为什么我的for循环不能正确获取argv
- Cryptopp:获取密码输入的填充字符串
- 无法获取已填充堆栈<char>的顶部元素
- 如何在类结束时获取填充的大小
- 填充字符数组的最佳方法(获取与cin.getline)
- 如何获取结构或类的尾随填充的大小
- 填充列表<>使用数组获取错误的数字
- 当从列表中获取值时,我填充其中的数组不返回任何值
- 使用发送消息填充列表框获取垃圾