none
关于 引用 析构 临时对象 的一些疑问。。。。。 RRS feed

  • 问题

  • #include <iostream>
    using namespace std;
    class A
    {
      int a;
    public:
      A(){cout<<"A was constructed. at:"<<this<<endl;}
      A(A const& a){cout<<"A was copied. at:"<<this<<endl;}
      ~A(){cout<<"A destructed."<<endl;}
    };
    
    A fn(A const& a)
    {
      cout<<"In fn:"<<&a<<endl;;
      return a;
    }
    
    int main()
    {
      cout<<&fn(A())<<endl;
      cout<<"after fn() called"<<endl;
      system("pause");
    }

    如上的一段代码,结果是:

    A was constructed. at:002CFBC8
    In fn:002CFBC8
    A was copied. at:002CFBD4
    002CFBD4
    A destructed.
    A destructed.
    after fn() called
    Press any key to continue . . .

    我的疑问是明显   A()产生的临时对象  先于返回时 用拷贝构造函数产生的临时对象

    它们是在栈上吧

    那么问题是,后者(指返回的对象)应该在更低的地址上呀?因为照栈的向下增长方向就可以这样判断呀?

    有哪里不对吗?请达人指教,谢谢~~~~

    2010年5月31日 10:04

答案

  • C++标准里面没有栈这个概念,编译器可以自由决定变量在内存里的存储方式。对于Visual C++,局部变量有可能是在当前线程的栈上分配(也可能优化到寄存器),不过分配的地址由编译器决定。比如如果两个变量是同一个类型,而且是一个变量用完了另一个才开始用,那么编译器可以将两个变量分配到同一个地址。



    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful, so they will appear differently to other users who are visiting your thread for the same problem.
    Visual C++ MVP
    2010年5月31日 20:38
    版主

全部回复

  • 不知道你是否考虑过这样的一个问题,不要说栈。通用点说内存。

    按照你预想的做法,所有新建的对象都必须只能够在旧的对象后面,程序在不停地运行,创建一些新的对象,销毁一些用完的对象。程序一直走,后内存一直往下面用.....

     

    好了,终于用到物理内存的尽头了。

    现在应该是报一个内存不足的异常呢,还是捡起前面空出来的内存继续用?

     

    要是报错,那就不用说啦,所有的程序都可以停工了;

    要是捡起来前面内存用,就跟上面的准则有冲突了:新建的对象摆在后建的对象前面。。。。。

     

    我想, windows 的内存分配机制,没有那么死板吧。

    2010年5月31日 13:18
  • 但这是在栈中,不是堆或者其他什么

    而且就main和fn的关系可以看出栈中的情况呀。。。

    2010年5月31日 13:48
  • C++标准里面没有栈这个概念,编译器可以自由决定变量在内存里的存储方式。对于Visual C++,局部变量有可能是在当前线程的栈上分配(也可能优化到寄存器),不过分配的地址由编译器决定。比如如果两个变量是同一个类型,而且是一个变量用完了另一个才开始用,那么编译器可以将两个变量分配到同一个地址。



    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful, so they will appear differently to other users who are visiting your thread for the same problem.
    Visual C++ MVP
    2010年5月31日 20:38
    版主
  • 感谢斑竹的解答,原来C++实现和C不是一样的呀。。。

     

    那么想再请问这方面资料哪里可以找到?有什么相关书籍嘛?

    2010年6月2日 3:29
  • C里面也应该有这种优化。讨论编译器内部的优化实现的文章很少,可以去搜索学术期刊看看有没有文章。

    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful, so they will appear differently to other users who are visiting your thread for the same problem.
    Visual C++ MVP
    2010年6月5日 15:36
    版主