函数中的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&lt;int&gt; 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 ++大向量多次调用的主要内容,如果未能解决你的问题,请参考以下文章

C语言学习_C如何在一个文件里调用另一个源文件中的函数

c语言函数的调用和声明

C++ 调用 C++ 库函数但执行了错误的函数

方法(转载)

函数调用在嵌入式架构设计中的应用

函数调用在嵌入式架构设计中的应用