在C语言中能否实现不同类型的运行时大小重叠数组?
运行时可变大小多类型安全访问缓冲区的实现方案问题
我需要一个通过malloc()分配的运行时可变大小缓冲区,能够安全地以uint8_t、uint16_t、uint32_t或uint64_t类型访问任何对齐充分、大小适配的内存槽位。
对于编译期固定大小的缓冲区,实现方式很直接:
union Buffer { uint8_t u8[N * 8]; uint16_t u16[N * 4]; uint32_t u32[N * 2]; uint64_t u64[N]; };
另一种思路是定义单个单元的union,再分配该union的数组:
union Buffer { uint8_t u8[8]; uint16_t u16[4]; uint32_t u32[2]; uint64_t u64; };
但这种方案存在明显缺陷:
- 无法保证连续union元素之间没有填充字节
- 无法安全地将缓冲区转换为
uint8_t、uint16_t、uint32_t或uint64_t指针,并在首个元素边界之外进行索引
我的核心需求如下:
- 拥有共享同一内存的
uint8_t、uint16_t、uint32_t和uint64_t类型重叠数组,可安全地将数组中任何对齐充分的槽位作为上述任一类型的左值访问 - 缓冲区为运行时可变大小,通过
malloc()/realloc()等函数分配 - 不存在严格别名违规或未定义行为
- 所有元素在内存中连续
请问是否存在符合上述所有要求的实现方式?还是只能通过memcpy()来安全读写指定类型的元素?
内容的提问来源于stack exchange,提问作者CPlus
相关产品推荐
相关产品推荐

