C++ 当使用Boost::mapped_文件时,为什么文件的大小会限制在65356字节?

C++ 当使用Boost::mapped_文件时,为什么文件的大小会限制在65356字节?,c++,boost,memory-alignment,memory-mapped-files,C++,Boost,Memory Alignment,Memory Mapped Files,对于我的程序,我使用boost::mapped_file来内存映射一个模式检测算法要访问的文件。为了测试映射文件的构造,以及随后执行的算法,我一直在测试文件的映射,方法是指定所需文件的大小,创建文件并用随机字符填充,然后映射该文件。问题是我遇到了一个奇怪的错误,我不太确定到底发生了什么 我得到的错误是,一旦文件大小达到65536字节,当尝试使用boost::mapped_file_source::size()方法时,返回值为0。在此之后我尝试使用的任何文件大小都只是65536的增量版本,这意味着

对于我的程序,我使用boost::mapped_file来内存映射一个模式检测算法要访问的文件。为了测试映射文件的构造,以及随后执行的算法,我一直在测试文件的映射,方法是指定所需文件的大小,创建文件并用随机字符填充,然后映射该文件。问题是我遇到了一个奇怪的错误,我不太确定到底发生了什么

我得到的错误是,一旦文件大小达到65536字节,当尝试使用boost::mapped_file_source::size()方法时,返回值为0。在此之后我尝试使用的任何文件大小都只是65536的增量版本,这意味着文件大小=65538时返回的大小为2。

我很好奇这是否与我看到的映射文件的对齐有关。但是,当我调用boost::mapped_file_source::alignment()方法时,它返回了4096,我不理解。对齐意味着什么,它如何影响这个问题


另外,当
文件大小>65536字节时,为什么boost::mapped_file_source::size()返回0?我知道65536等于对齐值(4096)*16,但我不明白为什么。

您应该显示相关代码

具体来说,如果未指定
length
,它将使用文件大小

Boost IOStreams没有您描述的限制,您可以很容易地显示:

#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);
}

65536是2^16,因此您可以在
std::fpos
为16位宽的平台上运行,或者在未显示的代码中的其他地方有一些截断到
无符号短字符
。请显示@dxiv您完全正确,我将大小截断为无符号短字符
short unsigned int size=mappedfile->mapfile.size()是的,谢谢。我无意中将文件大小截断为一个未签名的短文件,这就是截断的原因。
#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