Boost.IOStreams には固定サイズのメモリ マップ ファイルしかないため、特定の問題には役立ちません。Linux には、mremap
次のように機能するインターフェースがあります。
void *new_mapping = mremap(mapping, size, size + GROWTH, MREMAP_MAYMOVE);
if (new_mapping == MAP_FAILED)
// handle error
mapping = new_mapping;
ただし、これは移植性がありません (そして文書化も不十分です)。Mac OS X には がないようmremap
です。
いずれにせよ、ファイルを再度開く必要はmunmap
ありません。mmap
void *append(int fd, char const *data, size_t nbytes, void *map, size_t &len)
{
// TODO: check for errors here!
ssize_t written = write(fd, data, nbytes);
munmap(map, len);
len += written;
return mmap(NULL, len, PROT_READ, 0, fd, 0);
}
ここでは、事前割り当てスキームが非常に役立つ場合があります。ファイルの実際の長さを追跡し、閉じる前にもう一度切り詰めてください。