c++ - 使用 Boost::mapped_file 时,为什么文件的大小似乎上限为 65,356 字节?

标签 c++ boost memory-alignment memory-mapped-files

关闭。这个问题需要details or clarity .它目前不接受答案。












想改进这个问题?通过 editing this post 添加详细信息并澄清问题.

1年前关闭。




Improve this question




对于我的程序,我正在使用 boost::mapped_file 来内存映射我想要访问以用于模式检测算法的文件。为了测试映射文件的构造,以及我的算法的以下执行,我一直在通过指定我想要的文件大小、创建文件并用随机字符填充它来测试文件的映射,然后映射该文件。问题是我遇到了一个奇怪的错误,我不太确定发生了什么。
我得到的错误是,一旦我的文件达到 size=65,536 字节,当尝试使用 boost::mapped_file_source::size() 方法时,返回值为 0。我在此之后尝试使用的任何文件大小都只是65,536 的递增版本意味着文件大小=65,538 返回的大小为 2。
我很好奇这是否与映射文件的对齐有关,我看到它提到了 here .但是,当我调用 boost::mapped_file_source::alignment() 方法时,它返回了 4096,我不明白。对齐是什么意思,它是如何解决这个问题的?
另外,为什么 boost::mapped_file_source::size() 在 file_size>65,536 bytes 时返回 0 ?我知道 65,536 等于对齐值 (4096) * 16,但我不明白为什么。

最佳答案

您应该显示相关代码。 Docs

 explicit mapped_file_source( const std::string& path,
                             size_type length = max_length,
                             boost::intmax_t offset = 0 );
具体来说,如果 length未指定它将使用文件大小。
Boost IOStreams 没有您描述的限制,您可以轻松展示:
Live On Coliru
#include <boost/iostreams/device/mapped_file.hpp>
#include <iostream>
#include <sys/stat.h>
#include <fcntl.h>

static constexpr auto PATH = "path";

void test(std::size_t length) {
    int fd =::creat(PATH, 0600);
    if (::ftruncate(fd, length) || ::close(fd))
        ::perror("whoops");

    boost::iostreams::mapped_file_source m(PATH);
    std::cout
        << m.size() << " = "
        << std::hex << std::showbase << m.size() << "\n";
}

int main() {
    test(0XFFFF);
    test(0X1FFFF);
    test(0X2FFFF);
}
打印
65535 = 0xffff
0x1ffff = 0x1ffff
0x2ffff = 0x2ffff

关于c++ - 使用 Boost::mapped_file 时,为什么文件的大小似乎上限为 65,356 字节?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64922116/

相关文章:

C语言: how memory alignment happened in the stack for array

c++ - std::to_string 与字符串流

c++ - 使用 -fno-elide-constructors 的临时对象

c++ - C++程序中随机调用函数

c++ - shared_ptr 作为类成员

c++ - 如何解决 AVX 加载/存储操作的 32 字节对齐问题?

c++ - 自定义数据大小以进行内存对齐

c++ - 你能举一个C++中堆栈溢出的例子吗?

Boost asio架构文档

c++ - Boost::asio 套接字 - 如何干净地断开它们?