【发布时间】:2013-07-09 23:30:54
【问题描述】:
所以 std::array 和 boost::array (它们几乎相同,在下文中我将模糊地称为“数组”)旨在为数组提供一个容器对象,该对象不会产生向量的开销如果数组不动态改变大小,则不需要。但是,它们都是通过将数组大小不作为构造函数参数而是模板参数来设计的。结果:vector 允许在对象创建后动态调整大小;数组需要在编译时知道大小。
据我所知,如果您有一个数组,您将在创建对象时知道其大小,但在编译时不知道,那么您唯一的选择是 1) 使用向量会产生不必要的额外开销,2) 使用(非容器类型)原生数组(例如,int foo[42];),或者 3)从头开始编写自己的数组包装类。那么这是正确的吗,这是一种介于两者之间的情况,您可能想使用数组而不是向量,但不能?或者有什么我可以做的魔法对我有用吗?
这里有一些关于启发这个问题的细节(好的,很多),以防它帮助你理解:
我有一个模块 - 比如说调用者 - 它将在运行时重复生成二进制数据(无符号字符 [] 或数组),然后将它传递给另一个模块 - 比如说被调用者。被调用者模块不会修改数组(它会复制并在必要时进行修改),所以一旦调用者模块最初创建了数组,它就不会改变大小(也不会改变内容)。但是,出现了两个问题:1)调用者可能不会在每次生成数组时都生成相同大小的数组——它会在创建数组时在 rutime 时知道数组大小,但在编译时不知道。 2)调用者将数组传递给被调用者的方法需要能够获取调用者传递给它的任何大小的数组。
我想把它做成一个模板函数,例如,
template<size_t N> void foo(const array<unsigned char, N>& my_array);
但是,我使用接口类将接口与被调用模块中的实现分开。因此,该函数必须是一个虚方法,它与被模板化是互斥的。此外,即使这不是问题,它仍然会遇到与上述 #1 相同的问题 - 如果在编译时不知道数组大小,那么它也无法在编译时解析模板化函数。
我的实际功能:
virtual void foo(const array<unsigned char, N>& my_array); // but what is N???
总之,我是否正确,我唯一真正的选择是使用向量或原生数组,例如,
virtual void foo(const vector<unsigned char> my_array); // unnecessary overhead
virtual void foo(const unsigned char[] my_array, size_t my_array_len); // yuk
或者是否有一些我忽略的技巧可以让我使用 std::array 或 boost::array?
【问题讨论】:
-
C++14 有
std::dynarray和运行时大小的数组。 -
您是否确定了使用
std::vector需要多少开销,并将其确定为问题?我问是因为它的开销真的很小(如果你使用得当,每个容器有 1 个额外的指针):std::dynarrays 最大的优势实际上是基于堆栈的存储的可能性。 -
是的,事实是 std::vector 的开销可能不会杀死我......这就是我现在要依靠的。
标签: c++ arrays boost vector stl