我总是在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;
}
(在某些情况下,对齐很重要)。 感谢
答案 0 :(得分:1)
是的。将所有状态放在结构中,根据需要对齐和填充。优选地,结构上没有成员函数,使其保持微不足道。该类包含此结构的私有实例。类成员函数直接作用于此状态。
这应该足够了。此外,您可以清楚地分离状态和功能,这总是很好。倾向于与类中的set / get函数一起使用,除非您特别重视使用函数调用和状态访问的不一致语法。
Alignas也可能是有意义的。
答案 1 :(得分:0)
你的努力完全浪费时间。编译器对齐自己是正确的(如果你没有明确告诉他不要这样做)。 它在成员之间插入字节。它在结构的末尾插入足够的字节,使其整体大小是结构对齐规则的倍数。
你的努力也是富有成效的。如果用其他对齐规则编译另一个架构?然后编译器将填充字节插入填充字节。
只有在超出编译器或体系结构范围的情况下交换数据时,显式对齐和打包结构才有意义。