gpt4 book ai didi

c++ - 将一个 vector 的内存映射到另一个 vector

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:39:56 24 4
gpt4 key购买 nike

我有一些中间件使用的二进制数据 vector

std::vector<uint> data

此 vector 中的数据映射到类 Foo基本上是这样的:

|uint|uint|uint|uint|uint|uint|uint|uint|uint|
| F o o | F o o | F o o |

使用自定义放置分配器(如此处所述 Can I use an std::vector as a facade for a pre-allocated (raw) array? )我现在可以将第一个 vector 的内存映射到 std::vector<Foo> 类型的 vector

但是如果我对第二个 vector 进行操作,第一个 vector 的大小不会更新。

另一种方法是封装第一个 vector std::vector<uint8>在行为类似于 std::vector<Foo> 的自定义容器中但这需要付出很多努力(而且我不能使用 Boost)。

有什么优雅的解决方案吗?

最佳答案

情况与链接的问题非常不同。您不是在处理预先分配的存储,您已经拥有对象的数据。此外,您希望双方都能够修改 vector ,或者换句话说,他们拥有共享所有权。

这不是微不足道的。您可以提供一个“ View 类”,它提供对同一 vector 的另一组操作,或者让一组自由函数执行相同的操作。无论哪种方式,它们都必须具有引用语义。

一个免费的函数示例

template<typename T>
void push_back_foo(std::vector<uint8_t>& vec, T&& t)
{
auto it = vec.insert(vec.end(), sizeof(Foo), {});
new (&*it) Foo{std::forward<T>(t)};
}

对于所有其他功能依此类推。它们将 Foo 端的操作映射到 uint8_t 端的操作。

旁注:对结果 vector 进行指针运算在形式上是未定义的行为,因为那里没有 Foo 数组。在处理带有外观的二进制数据时,通常理解编译器不会烧掉你的房子,这样的手续会被忽略。

关于c++ - 将一个 vector 的内存映射到另一个 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53310858/

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