C++ 当使用Boost::mapped_文件时,为什么文件的大小会限制在65356字节?
对于我的程序,我使用boost::mapped_file来内存映射一个模式检测算法要访问的文件。为了测试映射文件的构造,以及随后执行的算法,我一直在测试文件的映射,方法是指定所需文件的大小,创建文件并用随机字符填充,然后映射该文件。问题是我遇到了一个奇怪的错误,我不太确定到底发生了什么 我得到的错误是,一旦文件大小达到65536字节,当尝试使用boost::mapped_file_source::size()方法时,返回值为0。在此之后我尝试使用的任何文件大小都只是65536的增量版本,这意味着文件大小=65538时返回的大小为2。 我很好奇这是否与我看到的映射文件的对齐有关。但是,当我调用boost::mapped_file_source::alignment()方法时,它返回了4096,我不理解。对齐意味着什么,它如何影响这个问题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的增量版本,这意味着
另外,当
文件大小>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