[英]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;
};
好吧,我可以看到兩種方式:
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
不知道我是否很好理解,這是怎么回事:
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.