C ++向量内存分配和运行时?
Posted
技术标签:
【中文标题】C ++向量内存分配和运行时?【英文标题】:C++ Vector memory allocation & run-time? 【发布时间】:2013-09-27 14:38:51 【问题描述】:我刚刚编写了一个小型 C++ 程序,只是为了了解向量如何与内存一起工作以及在运行时发生了什么。
这是我的代码:
#include <iostream>
#include <cstdio>
#include <ctime>
#include <vector>
int main()
clock_t start, end;
int x;
std::vector<int> a(5, 100);
start = clock();
for(int i = 0 ; i <= 900000000 ; i++)
x = a[0];
x = a[1];
x = a[2];
x = a[3];
x = a[4];
end = clock();
clock_t duration = end - start;
double durationPerSec = duration / (double)CLOCKS_PER_SEC;
std::cout << "Run-time : " << durationPerSec << std::endl;
return 0;
我得到了这个输出:
运行时间:18.7843
当我通过用动态数组替换向量来编写相同的代码时,运行时持续时间更容易接受:
运行时间:2.9526
我知道这段代码很愚蠢,但我想知道为什么我使用向量时运行时间这么长?那是因为我以错误的方式使用它还是仅仅因为有些东西我不明白?
感谢您的回复。
【问题讨论】:
你说的这个“动态数组”是什么? 您是否正在运行优化的构建? std::vector is so much slower than plain arrays?的可能重复 像这样的动态数组:int *dynamicArray = new int[5]; 我怀疑,如果你真的在优化的情况下进行编译,你的整个循环将会消失,因为它可以被证明是“死代码”(它对循环之外的任何东西都没有影响) . 【参考方案1】:我用g++ -O0 a.cc
运行它并得到
Run-time : 18.99
但是如果我使用g++ -O2 a.cc
Run-time : 0
为了更加主动,我用time ./a.out
运行第二个
time ./a.out
Run-time : 0
real 0m0.009s
user 0m0.002s
sys 0m0.002s
我把循环改成
for(int i = 0 ; i <= 900000000 ; i++)
a[0] = i ;
a[1] = i + a[0];
a[2] = a[1] + a[2];
a[3] = i + a[1] + a[2];
a[4] = i + a[1] + a[2] + a[3];
x = a[0];
x = a[1];
x = a[2];
x = a[3];
x = a[4];
那么g++ -O2
的结果是
time ./a.out
Run-time : 1.81
real 0m1.817s
user 0m1.811s
sys 0m0.001s
【讨论】:
是的,但是现在整个循环是否已经被优化掉了?它会给 a[i]=i 什么;在循环内部还是类似的东西? g++ -02 和 g++ - O0 有什么区别? -O0 没有优化。 -O2 通常是人们使用的。【参考方案2】:您应该在启用优化的情况下进行测量。
operator[]
是一个成员函数。当您使用[0]
访问元素时,它实际上是通过一个函数,因此尽管符号相同,但仍有更多指令要执行。在调试中,会有可测量的开销。在发布时,它通常是无法测量的。
【讨论】:
以上是关于C ++向量内存分配和运行时?的主要内容,如果未能解决你的问题,请参考以下文章