一般大对象不作为参数传递,而只是传递他们的指针或者引用
别说是个类了,一个大点的结构体都是如此.
这不是少产生一个变量的问题了.
c/c++的参数传递有两种方式
一种是值传递,一种是地址传递,这个我就不需要解释了.
值传递的时候,参数是存放在寄存器中,
我不知道你的寄存器多大,该不会有几十几百K那么大吧?呵呵
所以为什么传递地址而不是值传递的道理你懂了吧,这不单是效率问题(当然也是问题)

解决方案 »

  1.   

    建议你看一下inside c++.关于引用那一章。这涉及到一个向下继承的问题。
      

  2.   

    传值不光是个堆栈开销的问题,还会引起拷贝构造函数的执行。如果按你的声明方式调用func2,那么func2在调用func1时会首先调用拷贝构造函数为func1制作参数。但func1声明的参数类型为Base,因此Base的拷贝构造函数会被调用,而不是Sub的拷贝构造函数。却省拷贝构造函数要复制虚表,于是参数b中的虚表将是Base的虚表,而不是Sub的虚表,这样最终在func1中调用的vfunc将是Base的vfunc——虽然你实际传入的参数是Sub类型的。这样就失去了虚函数的本来意义。
    使用引用或指针可以避免拷贝构造函数执行,因此如果将func1的声明改为func1(Base &),那么调用func2的最终结果将是Sub的vfunc被执行——这也正是使用虚函数所期望的。
      

  3.   

    传 引用 只是一个对象的地址,当然开销要小了,如果是对象本身,不管多大,应该比指针大吧,如果比指针还小,你就不要用对象了,直接用变量就行了,既然有开销比较小的方法,为什么要增大开销呢?你不会是嫌CPU 太快或者内存太多了吧?
      

  4.   

    我对florist2000(善良的石头)的观点:
    “c/c++的参数传递有两种方式一种是值传递,一种是地址传递,这个我就不需要解释了.”
    有些看法.我认为C及C++中参数没有地址传递。
    比如
    int *p,m;
    已经声明的函数为 void fnMy1(int *v)大家想想,当你如下操作时:
    fnMy1(p)时,传递的不也是p的值吗?
    fnMy1(&m)时,传递的不也是&m的值吗?
    也就是说在C中,函数参数是什么类型传的也是什么。
    比如对于:
    int m;
    fnMy1(&m);传的是&m的值,对于 m来说是它的地址,也就是说你可以在
    fnMy1内改变int *v的值,然后&m却不会变化。
    之所以函数中会引起m的变化,是因为此时v的值与&m值相等[但不是相同一地址]
    所以能过*v的操作自然会令m变化。而C中没有像BASIC、PASCAL中“传址”的含意:
    REM BASIC
    DELCARE SUB MYSUB(BYREF A AS INTEGER) ' 值
    DELCARE SUB MYSUB(BYDEF A AS INTEGER) ' 址
    {PASCAL}
    PROCEDURE MYPRO(VAR I:INTEGER);     {址}
    PROCEDURE MYPRO(I:INTEGER);         {值}
    可能是我的想法也欠妥,但我始终认为,C和BASIC,以及PASCAL对于参数传递是性质是有差别的
    不知florist2000(善良的石头)老兄有什么看法?
    对于贴主:
    "为什么很多时候,函数func的形参要声明为引用?仅仅是为了在函数栈中少生成一个变量,而提高效率吗?如果仅仅是作效率考虑,那为什么下面代码不合法?
    void func1(Base a)
          { a.vfun();
          } 
    void func2()
          { Sub b;
            func1(b);
          }      "函数func的形参要声明为引用或指针 可以防止大内存的拷贝提高效率,但最重要的是支持多态。
    我的实验:
    #include <stdio.h>
    #include <iostream.h>
    #include <conio.h>class base
    {
    public:
    virtual void disp(){cout<<"base"<<endl;}};
    class sub :public base
    {
    public:
    virtual void disp(){cout<<"sub"<<endl;}
     
    };void show(base f)
    {
    f.disp(); 
    }void main(void)
    {
    sub s;
    show(s);
    getch();
    }程序绝没错!编译通过,但输出为"base",没有达到你的要求[如果你是想实现多态的话]。
    此时如果你将show的参数变为base &f,或base *f[此时相应的f->disp();show(&s);]
    就达到你的“欲望”了,输出:"sub".why?
    MSDN中已经讲得很明白了!
    “虚函数是指一个类中你希望重载的成员函数,当你用一个基类的指针或引用[明白了?]指向一个继对象的时候,你调用一个虚函数时,实际引发的是继承类的版本 。”
      

  5.   

    更正:
    DELCARE SUB MYSUB(BYREF A AS INTEGER) ' 址
    DELCARE SUB MYSUB(BYDEF A AS INTEGER) ' 值