gpt4 book ai didi

c++ - 为什么 mapped_file::data 返回 char* 而不是 void*

转载 作者:搜寻专家 更新时间:2023-10-31 01:40:06 32 4
gpt4 key购买 nike

或者更好的模板<T*>

如果内存映射文件包含一个 32 位整数序列,如果 data()返回了 void* , 我们可以静态转换为 std::uint32_t直接。

为什么 boost 作者选择返回 char*相反?

编辑:正如所指出的,如果可移植性是一个问题,则需要进行翻译。但是说一个文件(或者在这种情况下是一 block 内存)是一个字节流而不是一个比特流,或者 IEEE754 double ,或者复杂的数据结构,在我看来是一个非常宽泛的陈述,需要一些更多解释。

即使必须处理字节顺序,也能够直接映射到 be_uint32_t 的 vector 正如所建议的那样(并在此处实现)将使代码更具可读性:

struct be_uint32_t {
std::uint32_t raw;
operator std::uint32_t() { return ntohl(raw); }
};

static_assert(sizeof(be_uint32_t)==4, "POD failed");

是否允许/建议转换为 be_uint32_t* ?为什么,或者为什么不?

应该使用哪种转换?

EDIT2:因为似乎很难直截了当而不是讨论天气,所以 elaborator 的内存模型是由位、字节或单词组成的,我将改写一个例子:

#include <cstdint>
#include <memory>
#include <vector>
#include <iostream>
#include <boost/iostreams/device/mapped_file.hpp>

struct entry {
std::uint32_t a;
std::uint64_t b;
} __attribute__((packed)); /* compiler specific, but supported
in other ways by all major compilers */

static_assert(sizeof(entry) == 12, "entry: Struct size mismatch");
static_assert(offsetof(entry, a) == 0, "entry: Invalid offset for a");
static_assert(offsetof(entry, b) == 4, "entry: Invalid offset for b");

int main(void) {
boost::iostreams::mapped_file_source mmap("map");
assert(mmap.is_open());
const entry* data_begin = reinterpret_cast<const entry*>(mmap.data());
const entry* data_end = data_begin + mmap.size()/sizeof(entry);
for(const entry* ii=data_begin; ii!=data_end; ++ii)
std::cout << std::hex << ii->a << " " << ii->b << std::endl;
return 0;
}

鉴于 map文件包含正确顺序中预期的位,还有其他原因可以避免使用 reinterpret_cast 来使用我的虚拟内存而不先复制它吗?

如果没有,为什么要强制用户通过返回类型化指针来执行 reinterpret_cast?

请回答所有问题以获得奖励积分:)

最佳答案

In case the memory mapped file contains a sequence of 32 bit integers, if data() returned a void*, we could be able to static cast to std::uint32_t directly.

不,不是真的。您仍然必须考虑(如果没有别的)字节序。这种“一步转换”的想法会让您产生一种错误的安全感。您忘记了文件中的字节与您想要进入程序的 32 位整数之间的整个转换层。即使该翻译恰好在您当前的系统和给定文件上是空操作,它仍然是一个翻译步骤。

获得一个字节数组(字面意思是 char* 指向的内容!)要好得多,然后您知道您必须做一些思考以确保您的指针转换有效,并且您正在执行所需的任何其他工作。

关于c++ - 为什么 mapped_file::data 返回 char* 而不是 void*,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30244590/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com