如何在编译时计算c++11中的结构填充
How to calculate struct padding in c++11 during compile time?
问题
我有一个巨大的Foo 的std::矢量
struct Foo
{
int m_i;
char m_c;
char m_padding[3]; // want to replace this
};
我可以一次快速地以二进制形式转发这段连续的Foo。
我的问题是,如果我不明确地输入m_padding,计算它,并自己清除它,valgrind就会抱怨未初始化的写入。
问题
是否可以在C++11中编写一个模板类,它将在编译时为我计算填充
如果是这样的话,我可以把它添加到我所有Foo的末尾,并自动初始化/清除它们,而不会受到valgrind的抱怨。
我可以通过计算sizeof(padding)=sizeof(Foo)-sum(sizeof(parts))手动完成,但最好为这种计算创建某种类,因为所有信息在编译时都可用。
为了简单起见,假设Foo具有琐碎的布局(type_traits是一个重要但相切的问题)。此外,忽略订购问题/跨平台问题。
可能的方法
这并不能直接回答我最初的问题,但hvd的建议暗示了一种更简单的方法,似乎适用于我尝试过的一些简单的测试用例:
template<typename T>
struct BZero
{
BZero() { std::memset( this, 0, sizeof( T )); }
};
struct Foo : public BZero<Foo>
{
int m_i;
char m_c;
};
好吧,我可以看到两种方法:
- 使用类的
union
和与类一样大的char
数组 - 使用模板化的类和元编程来计算所有填充
不用说,前者似乎容易得多,所以给你:
template <typename T>
class ZeroedClass {
public:
template <typename... Args>
ZeroedClass(Args&&... args) {
new (&_.t) T(std::forward<Args>(args)...);
}
// Need other special members as well
~ZeroedClass() { _.t.~T(); }
// Accessors
T& access() { return _.t; }
T const& get() const { return _.t; }
private:
union U {
U() { memset(this, 0, sizeof(T)); }
char buffer[sizeof(T)];
T t;
} _;
}; // class ZeroedClass
不确定我是否理解得很好,这个呢:
struct FooBase {
int i;
char c;
};
template<typename T, size_t total>
struct padded : public T {
char pad[total-sizeof(T)];
};
typedef padded<FooBase, 8> Foo;
相关文章:
- 使用结构成员指针在C++中填充结构
- C++:使用缓冲区中的数据填充结构
- 在AAPCS(ARM ABI)下,C/C++结构填充的稳定性如何
- 我想直接在结构中插入,但没有一种方法可以正确避免填充问题
- 用二进制文件填充结构
- 哪些值存储在对齐的结构/类对象的填充字节中
- 使用初始化列表填充C++中的多维结构数组时出现问题
- sizeof 函数如何在带和不带位字段的结构上工作?(填充)
- 与STD :: BITSET的工会成员的结构填充
- 是否有任何环境会导致"int"结构填充?
- 如何在编译时计算c++11中的结构填充
- C++:OpenGL,glm和结构填充
- 关于结构填充
- 赛灵思微火焰结构填充/填料
- C++结构填充和字段打包
- C++ 用结构填充 2D 矢量
- VS 2008/2010中是否控制尾部结构填充?(#pragma包不够好)
- 64位计算机上的结构填充
- Visual Studio 2008 - 关于 C++ 中的结构填充
- 数据结构填充