未对齐指针以节省空间:如何在没有 UB 的情况下干净利落地执行此操作



考虑我有一个这样的结构:

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数组替换为指针数组和单独的计数器数组。这应该回避填充问题。

相关内容

最新更新