C++ 功能内存管理C++;

C++ 功能内存管理C++;,c++,memory-management,function,C++,Memory Management,Function,我有一个有点站不住脚的问题,但现在是我终于弄清楚这一点的时候了。 考虑具有某些参数和返回类型的正则函数。< /P> 我的问题是: 是否总是有一些参数的副本?我的意思是,即使函数期望引用或指针作为参数,实际上也会创建新的引用/指针,对吗?当函数结束时,是否为这些函数调用了一些析构函数 返回值也一样吗?返回值是否也从实际执行的函数的上下文中复制?或者这些地址只是某个地方,上下文中的值也被破坏了 我可能没有表达得太清楚。。如果你能用你的方式解释一下,当调用某个函数时,它是如何与内存一起工作的,我将非常

我有一个有点站不住脚的问题,但现在是我终于弄清楚这一点的时候了。 考虑具有某些参数和返回类型的正则函数。< /P> 我的问题是:

  • 是否总是有一些参数的副本?我的意思是,即使函数期望引用或指针作为参数,实际上也会创建新的引用/指针,对吗?当函数结束时,是否为这些函数调用了一些析构函数

  • 返回值也一样吗?返回值是否也从实际执行的函数的上下文中复制?或者这些地址只是某个地方,上下文中的值也被破坏了


  • 我可能没有表达得太清楚。。如果你能用你的方式解释一下,当调用某个函数时,它是如何与内存一起工作的,我将非常感激。我只是对处理器的功能有一个粗略的了解,但我已经处理过汇编程序,所以至少有一些东西需要处理。

    C++和C一样,是一种按值调用的语言,所以通常都会复制参数

    当:

    调用时,创建其参数的副本并将其传递给函数。当:

    void f( int * x ) {
    }
    
    调用时,生成指针的副本并将其传递给函数

    例外情况是使用引用时:

    void f( int & x ) {
    }
    
    没有复制,但在内部(可能)使用一个指针来传递参数的地址-但是,您不应该考虑这一点

    同样的情况也适用于返回值:

    int f() {
      return 1;
    }
    

    创建值1的副本并将其返回给调用方。如果函数返回指针,则会创建指针的副本。再一次,引用是例外,因为没有复制,但是内部指针(可能)用来返回值。

    < P>您需要查看C++书本/手册等关于“按引用”和“按值调用”的区别的讨论。尼尔的答案是正确的——默认值是按值调用,但是C++中的函数(不是C)可以指定一个特定的参数,即引用引用。p> 还要注意,按值调用可能会导致结构副本:

    struct foo f(struct bar x) { ... } 
    ... 
    struct foo myfoo;
    struct bar mybar;
    
    myfoo = f(mybar);
    

    f()按值获取结构(即,临时复制它,通常在堆栈上),并且f()还返回复制到mybar中的不同结构。

    分别在创建和销毁对象时调用构造函数和析构函数,在引用和指针的情况下不会调用它们


    在引用/指针作为参数的情况下,只复制地址而不复制数据;而在对象作为参数的情况下,实际数据会被复制(在对象具有深层继承层次结构的情况下,成本会很高)。

    尼尔的回答是正确的,但请注意,允许编译器对此进行优化。这被恰当地称为“复制省略”。有关此优化的详细说明,请参见以下链接:


    太好了:)这正是我想听到的嗯。。通常,特别是对于整数、指针和较小的类型,它们也可能存储在寄存器中,用于按值调用和返回。所以,是的,复制是建立的,但不在RAM中。可能值得一提的是,返回对堆栈变量的引用是BAAAAD。继承的深度与复制的费用无关。
    struct foo f(struct bar x) { ... } 
    ... 
    struct foo myfoo;
    struct bar mybar;
    
    myfoo = f(mybar);