c - 将文件系统用作存储库时处理对齐问题的策略

标签 c io

我处于需要在文件中存储大量元组(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/

相关文章:

networking - 网卡驱动程序中的 DMA 是否同步?

c - 为什么我的 C 代码没有生成我设置范围内的随机数?

c - Makefile 重新链接错误

perl - 几个 fork 进程中的第二个不在 Haskell 中运行 (GHC 7.8.4)

mysql - 磁盘 IO 与 PHP 中的 MySQL 查询

python - 在 Python 中不关闭打开的文件会有什么后果?

c - sockaddr 和 sockaddr_storage 的区别

c - 结构体和指向指针的指针

c - 为什么 uint16_t 不显示所需的输出?

c# - 并行扩展