问题
我有一个很多Foo的std :: vector
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,sizeof( T )); } }; struct Foo : public BZero<Foo> { int m_i; char m_c; };
解决方法
好吧,我可以看到两种方式:
>使用类的联合和类的大小的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,sizeof(T)); } char buffer[sizeof(T)]; T t; } _; }; // class ZeroedClass