gpt4 book ai didi

c++ - 是否有一个 STL 容器在运行时指定元素大小的连续内存中存储元素数组?

转载 作者:搜寻专家 更新时间:2023-10-31 00:45:13 26 4
gpt4 key购买 nike

我正在尝试创建看起来接近于我的文件规范工作方式的容器。它类似于 vector ,但元素的类型由哈希表定义。

如果我在编译时知道类型,我可以这样写:

struct foo {
float a,b,c;
int d;
byte e,f;
};

std::vector<foo> foovector;
foovector.push_back(foo f);

我在编译时没有结构。我只有一个从文件头获得的模式。所有元素的大小都相同,并且元素内的每个项目都具有相同的偏移量。容器在添加任何元素之前定义了哈希表。

typedef Toffset uint; //byte offset;
typedef Ttype uint; //enum of types

std::unordered_map<std::string, std::pair<Toffset,Ttype>> itemKey;
itemKey["a"] = 0;
itemKey["b"] = 4;
itemKey["c"] = 8;
itemKey["d"] = 12;
itemKey["e"] = 16;
itemKey["f"] = 17;

nstd::interleaved_vector superfoo(itemKey, 10); //hashtable, pre-allocation size

nstd::interleaved_vector::iterator myIterator;

myIteratorGlobal = superfoo.begin;
myIteratorA = superfoo["a"].begin;
myIteratorB = superfoo["b"].begin;

*myIteratorB = 2.0f;
*myIteratorGlobal["d"] = 512;

我的想法是我可以快速 memcpy 原始数据进出文件。迭代器偏移很容易。我的问题是:

  1. 有没有什么已经这样做了?

  2. 这是个坏主意吗?我应该只创建一个 vector 并更新每个元素吗?我希望有数百万个元素。 foo 的大小范围为 20 到 200 字节。

  3. 这是个坏主意?我应该改为创建耦合 vector ,每个项一个?

  4. 或者这个“interleaved_vector”是解决我的问题的好方法吗?

最佳答案

Is there an STL container that stores an array of elements in contiguous memory where the element size is specified at runtime?

没有。

您要求的看起来像是内存池的特定实现。也许 Boost.Pool 库或其他实现对您有用?如果您习惯于使用原始内存和特定于 C++ 的对象创建/销毁,那么编写您自己的一个应该不难。

回答您的问题:

Does anything do this already?

对我来说,这个想法就像一个内存池。内存池种类繁多,因此您想要的实现完全取决于您的具体需求。

Is this a bad idea? Should I just create a vector and new up each element? I expect to have millions of elements. The range of sizes of foo will be 20 to 200 bytes.

如果您想限制内存碎片,这不是一个坏主意。池通常用于解决这个问题和其他与内存组织相关的问题。

例如,在视频游戏中经常这样做,主要是在游戏机上,但如果您需要高性能或大量内存,也会在 PC 上使用。

如果您正在制作原型(prototype)或者如果您没有大量数据要分配,我不建议您费心。如果你这样做,那么也许首先实现隐藏在工厂后面的最简单的分配(使用 vector 和新的)会很好,并且允许你使用池替换工厂实现。这样您首先检查一切是否正常,然后进行优化。

关于c++ - 是否有一个 STL 容器在运行时指定元素大小的连续内存中存储元素数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7251015/

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