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

问题

我有一个很多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

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...