如何在编译期间计算c ++ 11中的struct padding?

kfm*_*e04 8 c++ sizeof c++11

问题

我有一个很多Foo的std :: vector

struct Foo
{
  int   m_i;
  char  m_c;
  char  m_padding[3];   // want to replace this
};
Run Code Online (Sandbox Code Playgroud)

我可以一次性以二进制形式快速编写这个连续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;
};
Run Code Online (Sandbox Code Playgroud)

Kiw*_*iwi 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;
Run Code Online (Sandbox Code Playgroud)