考虑我有一个这样的结构:
struct X{
int* somePtr;
uint16_t someCounter;
}
我在非常大的数组(数亿X
s)中广泛使用这个结构。由于C++将指针与 8 字节边界对齐,因此该结构最多使用 16 个字节。如果没有这种对齐方式,结构将只使用 10 个字节,这就是我想要实现的,因为额外的 6 个字节确实会消耗大量内存。
所以我使用 char 数组和联合黑客尝试了这个:
struct X{
char somePtr[8];
uint16_t someCounter;
int* getPtr(){
union U { int* ptr; char chars[8]; };
U u;
u.chars = somePtr;
return u.ptr;
}
}
这将产生所需的 10 字节结构。我现在的问题是:这种方法有什么缺点?它会触发未定义的行为吗?这是在 C++11 中实现"包装"结构的最佳方法,还是有更好/更清洁的结构?如果 a 有巨大的 X
结构数组,使用这样的打包结构是个好主意吗?
我的平台是x86 linux,但如果解决方案是完全可移植的,那就太酷了。
据我所知,您提出的解决方案应该可以正常工作。缺点是复杂性和可能的性能。
另一种方法是将单个structs
数组替换为指针数组和单独的计数器数组。这应该回避填充问题。