我处于需要在文件中存储大量元组(u32、float)的情况。该文件被有效地视为一种数组,我希望能够 mmap()
它,这样我就可以直接读取值并只编辑部分数据,而无需重写整个数据每次进行更改时都会归档。
现在,存在对齐问题,即,如果元组表示为结构,则 64 位 archs 上的两个值之间可能存在填充:
struct tuple {
uint32_t x;
float y;
};
现在,我添加了一个#pragma pack
指令来确保结构大小不超过 8 个字节,假设它可以(是吗?)在 4- 上对齐 float 字节边界,sizeof(float) == 4
。
但这看起来很笨拙,所以我想到了其他方法来处理这个问题。我看到两个选项:
- 将元组系列解释为一个长 u32 数组,并为每个读/写操作重新解释 float 。
- 放弃将文件直接映射到内存的可能性,在需要时费力地将每个元组解压到主内存中,并时不时地重写整个文件。
你会怎么做?
最佳答案
一点也不笨拙。这就是“pack”指令的用途。我会用编译时断言该结构是 8 个字节来强化您的代码:
static_assert( sizeof( tuple ) == 8, "tuple not 8 bytes" );
一些较旧的编译器不支持 static_assert(我认为 gcc 4.3 之前和 MSVC10 之前)
关于c - 将文件系统用作存储库时处理对齐问题的策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26717990/