问题
我有一个gdillion 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, 0, sizeof( T )); }
};
struct Foo : public BZero<Foo>
{
int m_i;
char m_c;
};
答案 0 :(得分:3)
好吧,我可以看到两种方式:
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
答案 1 :(得分:0)
不确定我是否理解,这是怎么回事:
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;