函数中的c ++大向量多次调用
Posted
技术标签:
【中文标题】函数中的c ++大向量多次调用【英文标题】:c++ big vector in function called multiple times 【发布时间】:2016-10-29 02:35:41 【问题描述】:我有一个函数可以为其内部工作创建一个大向量。假设我们还需要多次调用此函数。处理向量的内存创建/销毁的最佳方法是什么(因素是性能、代码质量……)
方法一:
void f(int n)
vector<int> v(n);
int main()
for (int i = 0; i < 1000000; ++i) f(10000000);
方法二:
void f(int n)
static vector<int> v;
v.reserve(99999999); // say this is the maximum possible size
v.resize(n);
int main()
for (int i = 0; i < 1000000; ++i) f(10000000);
方法 2 肯定比方法 1 快,但是看起来很难看。 最好的方法是什么
【问题讨论】:
有趣的是,似乎导致性能提升的真正原因是vector<int> v(n);
中正在发生的事情以减慢它的速度。至少我是这么认为的。可能在第一种方法中强制执行 2 个保留调用。
stl 向量的源代码也将是特定于编译器的。
【参考方案1】:
用operator()
把函数变成一个类。
class f_class
std::vector<int> v;
public:
f_class()
v.reserve(99999999);
void operator()(int n)
v.resize(n);
// Whatever the original f() did
;
int main()
f_class f;
for (int i = 0; i < 1000000; ++i) f(i);
【讨论】:
仍然在这个解决方案中,调用者(这里是 main())必须知道 class_f 使用一个向量,如果我们在每次迭代中都执行 class_f()(i),我们将再次陷入同样的问题.这意味着外部必须对不符合OOP原则(封装、抽象)的class_f的实现有所了解【参考方案2】:根据你的例子,你的向量大小是一样的,为什么不只创建一个向量呢?
using namespace std;
void f(vector<int>& v)
// Do something with vector
int main()
int n = 10000000;
vector<int> v(n);
for (int i = 0; i < 1000000; ++i)
f(v);
【讨论】:
【参考方案3】:v.reserve() //deals with capacity.
v.resize(n) //deals with size.
在方法2中,静态向量所经历的只是改变大小,然而,保留空间大于大小,因此容量没有变化,当你在循环中迭代时只是增加一。因此,大小每次都会增加一。容量没有变化。 通常如果对 int 的空向量调用 resize,则该 resize 范围内的向量元素将被初始化为 0。
在方法 1 中,向量的大小为 n,但使用最接近的 n
在方法 2 中,向量是静态的并且保持不变。
您可能想阅读:
Reserve
Capacity
此外,如果您有向量保留内存,并且假设您可能不会受到内存量的困扰,那么通过摊销分析不断插入的内存预分配将具有Big-O(1),每个操作。
【讨论】:
以上是关于函数中的c ++大向量多次调用的主要内容,如果未能解决你的问题,请参考以下文章