【发布时间】:2017-06-24 04:38:55
【问题描述】:
昨天,我偶然发现了一个名为 Eigen 的库,它提供了 an array class,其签名如下:-
Array<float,Dynamic,1> b;//<--- dynamic = unknown at compile time
Array<float,3,1> c;//<--- both row(=3) and col(=1) known at compile time
这里是Array.h和一个密切相关的类PlainObjectBase.h的源代码。
据我所知(通过挖掘),如果在编译时知道 row 和 col,它会将内存分配为 stack variable,与以下方式相同:-
float c[3];
我觉得很酷,因为它可以避免不必要的堆分配。
在某些情况下非常适合。
问题
什么是 C++ 技术/语义来创建支持固定和动态大小在 1 个类中的集合?
它背后的想法是什么?
我不是要完整的代码或任何 sn-p,但我不介意。
Answer 可以忽略所有关于 Eigen Array 是如何实现的事实。 (Eigen 只是一个例子。)
我想要一些可靠的想法来改进我自己的数组封装器,让它变得像那样酷。
我的糟糕解决方案
- 为两种场景(动态和修复)创建字段,但在每个场景中,只使用其中的一部分。
- 然后,发送垃圾邮件
std::enable_if来控制 Dynamic vs Const,但我认为这是反模式。
【问题讨论】:
-
这是一个模板类,因此您可以使用 enable_if 和 is_arithmetic 来制作模板特化。这是一个示例:stackoverflow.com/questions/14294267/…
-
@Jerry Jeremiah 这是一个非常好的链接,谢谢。它实际上可能是一个答案。
标签: c++ arrays c++11 stack heap-memory