gpt4 book ai didi

c++ - 快速将 unsigned char vector 转换为 POD 结构 vector ,反之亦然

转载 作者:行者123 更新时间:2023-11-30 04:42:15 27 4
gpt4 key购买 nike

我想读/写二进制数据,本质上是普通旧数据结构的 vector 。

我设法用 char 数组做到了这一点,但现在我需要将这些数组来回转换为结构 vector 。

我已经设法通过直接读/写文件来做到这一点:

int main() {
struct thing { float f; char c; };
std::vector<thing> write_this = { {2,'c'},{5,'f'},{543,'e'} };

std::ofstream outfile{ "test.bin", std::ios::binary };
outfile.write(reinterpret_cast<const char *>(write_this.data()),
write_this.size() * sizeof(decltype(write_this)::value_type));
outfile.close();

std::vector<thing> result(3);

std::ifstream infile{ "test.bin", std::ios::binary };
infile.read(reinterpret_cast<char *>(result.data()),
result.size() * sizeof(thing));

for (auto& i : result)
std::cout << i.f << " " << i.c << ' ';
std::cout << '\n';
system("PAUSE");
return 0;
}

因为我想将几个不同的数据段存储到一个文件中,所以我使用 unsigned char vector 作为中介。我现在需要将 char 数组或 char vector 转换为结构 vector ,反之亦然。

最简单/最干净/最快的方法是什么?

最佳答案

前言:请注意,写入的数据不能移植到其他系统,对于某些 POD(包含位域的 POD)甚至不能移植到由不同编译器编译的同一系统上的其他进程——除非这些系统以某种方式保证具有相同的二进制表示。

此外,写入数据中的内存引用对于其他进程将毫无意义,即使对于同一程序的单独执行也是如此。

quickly cast a vector of unsigned char into a vector of POD struct and vice versa

你可以这样做:

static_assert(std::is_trivial_v<thing>);
constexpr int s = sizeof(thing);
int n = 3;
std::vector<unsigned char> result_raw(n * s);
unsigned char* data = result_raw.data();
infile.read(reinterpret_cast<char*>(data), n * s);

// ->
for(int i = 0; i < n; i++) {
unsigned char temp[s];
unsigned char* addr = data + i * s;
std::memcpy(temp, addr, s);
new (addr) thing;
std::memcpy(addr, temp, s);
}
thing* result = std::launder(reinterpret_cast<thing*>(data));
// <-

现在,您有一个指向第一个 thing 的指针在 vector 中。关于这一点的美妙之处在于,创建对象并使程序明确定义的箭头注释之间的部分编译为零指令(只要您启用优化)。

你没有得到 std::vector<thing>尽管。为此,您必须将一个 vector 中的所有内容复制到另一个 vector 中。或者您可以直接阅读示例中的内容的 vector 。但是你不想做后者,前者比不复制要慢。


将来,如果p0593rX提案被采纳后,这段什么都不做的代码块可以大大简化。

关于c++ - 快速将 unsigned char vector 转换为 POD 结构 vector ,反之亦然,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58826978/

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