c ++ - struct和class padding

时间:2015-06-18 16:40:45

标签: c++ class struct alignment

我总是在C中填充结构以获得最佳性能(良好的内存对齐)。

// on a x86_64 
struct A {

 int64_t z;
 int32_t x;
 int16_t y;
 // we don't care the uint8_t position, as they are 1 byte wide.
 uint8_t s[8];
 uint8_t t[4];

}

但是如果我决定采用c ++路线,为另一个目的创建一个对象,我需要一个类:

class B {

   B(){}
  ~B(){}

 public:
   int64_t a;
   int8_t  b;

 private:
   int32_t c;

//methods...
}

然后,c不再对齐。

有没有办法避免这样做(多个标签):

class B {

  B(){}
  ~B(){}

 public:
   int64_t a;

 private:
   int32_t c;

 public:
   int8_t  b;

}

(在某些情况下,对齐很重要)。  感谢

2 个答案:

答案 0 :(得分:1)

是的。将所有状态放在结构中,根据需要对齐和填充。优选地,结构上没有成员函数,使其保持微不足道。该类包含此结构的私有实例。类成员函数直接作用于此状态。

这应该足够了。此外,您可以清楚地分离状态和功能,这总是很好。倾向于与类中的set / get函数一起使用,除非您特别重视使用函数调用和状态访问的不一致语法。

Alignas也可能是有意义的。

答案 1 :(得分:0)

你的努力完全浪费时间。编译器对齐自己是正确的(如果你没有明确告诉他不要这样做)。 它在成员之间插入字节。它在结构的末尾插入足够的字节,使其整体大小是结构对齐规则的倍数。

你的努力也是富有成效的。如果用其他对齐规则编译另一个架构?然后编译器将填充字节插入填充字节。

只有在超出编译器或体系结构范围的情况下交换数据时,显式对齐和打包结构才有意义。