带有编译时初始化的常量数据的容器类

时间:2015-07-28 11:36:25

标签: c++ c++14 avr compile-time-constant

我搜索了一些std :: vector,但没有大的开销和比std :: array多一点,因为使用std :: array我没有存储大小(只能从类型本身知道) )。

我想要实现的目标:

用"动态"容器就像:

std::map< int, std::vector< std::pair<int,int>>>;

我在运行时不需要修改,但在运行时我需要大小信息。用std :: array替换std :: vector是行不通的,因为对于所有不是我需要的map条目,数组的大小必须相同。

我只是!想问一下是否已有可用的实施方案。如果答案仅仅是#34; No&#34;,则无需提出如何完成工作的建议。我只想不再重新发明轮子: - )

背景:我可以在我的小型avr控制器上使用stl,但开销是#34;有点&#34;高。因此,我寻找一个有希望的标准实现,它满足编译时常量表示的需要,使用begin()/ end()和迭代器等已实现的功能来满足最小容器需求,以便将它们用于基于范围和其他的范围。

如果有我搜索的内容,也可以使用c ++ 14。

我发现的所有内容都是完整的模板,其中对数据的访问也是编译时常量,如:

container.get<2>() 

我也无法使用,因为我需要运行时变量来访问我的数据。

编辑:使用std :: vector时出现了哪些问题/开销:

在使用std :: vector时我还需要new / delete,这导致了avr的malloc / free。我还发现,在avr上,向量本身的初始化为我使用的每个模板实例获取了大约350字节的代码。像operator[]这样的访问函数以及迭代器都非常小。

3 个答案:

答案 0 :(得分:2)

要避免std::vector开销,您可以使用std::initializer_list

const std::map<int, std::initializer_list<std::pair<int, int>>>

答案 1 :(得分:1)

我并不完全清楚您正在寻找什么,但我认为您可以通过以下方式实现您的目标:

  1. 您不知道每个包含元素的确切大小(比如N个元素),并且您会在程序启动时知道它。然后,只要知道容器的大小,只保留一个连续的内存块来保存所有容器的所有内部元素。 (一个动态分配)
  2. 使用范围:std::vector(start, end)构建的向量创建地图,其中start和end通过N个元素块计算。
  3. 然后填充地图。如果你不严格需要地图,你也可以计算每个向量的开始和结束位置,然后创建一个带有每个向量位置索引的初始数组......

答案 2 :(得分:0)

原则上你所要求的似乎是不可能的。您说您希望避免类似向量的堆分配,但堆栈上类型的大小必须在编译时知道,并且对于该类型的所有成员都是相同的。由于map是一个同类容器,因此值类型必须是具有常量大小的单一类型。您可以使用元组替换映射,但是在编译时必须知道所有密钥。