簡體   English   中英

如何在編譯時在c ++ 11中計算結構填充?

[英]How to calculate struct padding in c++11 during compile time?

問題

我有一個gazillion 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;
};

好吧,我可以看到兩種方式:

  1. 使用類的union和與類一樣大的char數組
  2. 使用模板化的類和元編程來找出所有填充

不用說,前者似乎容易得多,所以您可以:

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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM