【发布时间】:2010-09-10 22:16:01
【问题描述】:
我正在编写一个内部循环,需要将structs 放在连续存储中。我不知道这些structs 中有多少会提前。我的问题是 STL 的 vector 将其值初始化为 0,所以无论我做什么,都会产生初始化成本以及将 struct 的成员设置为其值的成本。
有什么方法可以阻止初始化,还是有一个类似 STL 的容器,具有可调整大小的连续存储和未初始化的元素?
(我确信这部分代码需要优化,而且我确信初始化是一笔不小的开销。)
另外,请参阅下面的我的 cmets 以了解初始化发生的时间。
一些代码:
void GetsCalledALot(int* data1, int* data2, int count) {
int mvSize = memberVector.size()
memberVector.resize(mvSize + count); // causes 0-initialization
for (int i = 0; i < count; ++i) {
memberVector[mvSize + i].d1 = data1[i];
memberVector[mvSize + i].d2 = data2[i];
}
}
【问题讨论】:
-
注意 - 使用 reserve() 不是解决方案,因为您无法合法访问位于 end() 及以上位置的数据。
-
另一个澄清:不是构造函数将值初始化为0。而是resize调用insert。
-
你也可以给我们结构声明吗?谢谢... :-)
-
注意:无论如何您都无法访问未初始化的数据。 vector
过去 .end() 和 T[] 的未初始化成员的问题相同。但是有了向量,调试代码现在很可能会告诉你。阵列代码将在客户 PC 上静默失败。 -
这是个好问题。对于某些应用程序,重要的是要意识到 std::vector 总是初始化其元素,即使它们是普通旧数据 (POD)。
标签: c++ optimization stl vector