【发布时间】:2017-07-21 20:55:05
【问题描述】:
我正在创建一个包含一些数据对象的文件。数据对象有不同的大小,是这样的(非常简化):
struct Data{
uint64_t size;
char blob[MAX_SIZE];
// ... methods here:
}
在稍后的某个步骤,文件将在内存中 mmap(),
所以我希望每个数据对象的开头都以 8 个字节对齐的内存地址开始,uint64_t size 将被存储(让我们忽略字节序)。
代码看起来或多或少这样(目前硬编码 8 个字节):
size_t calcAlign(size_t const value, size_t const align_size){
return align_size - value % align_size;
}
template<class ITERATOR>
void process(std::ofstream &file_data, ITERATOR begin, ITERATOR end){
for(auto it = begin; it != end; ++it){
const auto &data = *it;
size_t bytesWriten = data.writeToFile(file_data);
size_t const alignToBeAdded = calcAlign(bytesWriten, 8);
if (alignToBeAdded != 8){
uint64_t const placeholder = 0;
file_data.write( (const char *) & placeholder, (std::streamsize) alignToBeAdded);
}
}
}
这是实现文件内对齐的最佳方式吗?
【问题讨论】:
-
“对齐”是什么意思?在文件中的特定位置写入?您是否尝试过寻找在文件中到想要的位置?
-
我会编辑问题
-
因此,您希望所有数据都采用 8 字节格式(64 位)。对吗?
-
只是一个关于你可能通过在文件中向前搜索并用间隙写入可能得到的“洞”的注释,当你对文件进行内存映射时,这些“洞”将被包括在内,结构的位置将在内存映射中对齐 8 字节。此外,文件中的“漏洞”可能会减少它在磁盘上使用的空间。如果您用将占用磁盘空间的数据(甚至是零)填充这些孔。
-
你必须四舍五入。所以它是 8 * ((offset + 7) / 8)。