+ -
当前位置:首页 → 问答吧 → 为什么堆和栈上面创建对象的时间差距这样大?

为什么堆和栈上面创建对象的时间差距这样大?

时间:2010-08-28

来源:互联网

  1. //============================================================================
  2. // Name        : helloworld.cpp
  3. // Author      :
  4. // Version     :
  5. // Copyright   : Your copyright notice
  6. // Description : Hello World in C++, Ansi-style
  7. //============================================================================
  8. #include <cstdio>
  9. #include <ctime>
  10. #include <cstdlib>
  11. #include <iostream>
  12. #include <list>
  13. using namespace std;

  14. class Object{
  15. public :
  16.         Object() : i(0),n1(0){
  17.         }

  18.         void foo(){
  19.                 cout<<"foo():"<<i<<endl;
  20.         }
  21.         ~Object(){
  22.         }

  23.         Object& operator +=(int i)
  24.         {
  25.            this->i += i;
  26.            return *this;
  27.         }
  28. private:
  29.         int i;
  30.         const int n1;
  31.         static int n2;
  32. };

  33. int Object::n2 = 0;

  34. int main() {
  35.         clock_t start,finish;
  36.         start = clock();
  37.         for(int i=0;i<10000000;++i){
  38.                 new Object();
  39.         }
  40.         finish = clock();
  41.         cout<<"heap "<<(finish - start)<<" ms."<<endl;

  42.         start = clock();
  43.         for(int i=0;i<10000000;++i){
  44.                 Object obj;
  45.         }
  46.         finish = clock();
  47.         cout<<"stack "<<(finish - start)<<" ms."<<endl;
  48.         return 0;
  49. }
复制代码
运行结果:
heap 1700 ms.
stack 146 ms.

作者: evaspring   发布时间: 2010-08-28

主要的时间耗子 分配内存 上
栈比堆快,但快不了这么多

作者: bruceteen   发布时间: 2010-08-29

显然的, 一个硬件调整栈指针(说不定那个循环根本就没调整过), 一个软件实现堆。


试试:
  1. Object* o = static_cast<Object*>(operator new(sizeof *o));
  2. for (...)
  3. {
  4.       new (o);
  5.       o->~Object();
  6. }
复制代码
btw, clock()是和CLOCKS_PER_SEC搭配使用的。

作者: OwnWaterloo   发布时间: 2010-08-29

for(int i=0;i<10000000;++i){

                Object obj;

        }这里应该只有一次,试试在构造函数里面加个打印,看有几次

作者: hellioncu   发布时间: 2010-08-29