函数内存管理C ++

时间:2010-01-28 14:33:51

标签: c++ memory-management function

我有一点点蹩脚的问题,但现在是时候我终于清楚了。 考虑具有一些参数和返回类型的常规函数​​。

我的问题是:

  1. 是否总是制作一些参数副本?我的意思是即使函数需要引用或指针作为参数,实际上还是创建了新的引用/指针,对吧?当函数结束时,是否有一些析构函数需要那些?

  2. 返回值是否相同?是否还从实际执行的函数的上下文中复制了返回值?或者那些只是某处的地址而且上下文中的值也被破坏了?

  3. 我可能没有太清楚地表达它...如果你只是按照自己的方式解释当一些函数被调用时它如何与内存一起使用我会很感激。我对处理器的功能只是偶然的想法,但我已经处理了汇编程序,所以至少有一些东西可以使用。

4 个答案:

答案 0 :(得分:6)

与C一样,C ++是一种按值调用的语言,因此通常会创建参数副本。

当:

void f( int x ) {
}
调用

,生成其参数的副本并传递给该函数。当:

void f( int * x ) {
}
调用

,制作指针的副本并传递给函数。

例外情况是使用引用时:

void f( int & x ) {
}

没有复制,但在内部指针(可能)用于传递参数的地址 - 但是你不应该考虑这个。

返回值完全相同:

int f() {
  return 1;
}

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

答案 1 :(得分:3)

Neil的回答是正确的,但请注意,编译器可以对此进行优化。这恰当地称为“复制省略”。可以在以下链接中找到有关此优化的非常好的解释:

http://cpp-next.com/archive/2009/08/want-speed-pass-by-value

答案 2 :(得分:1)

您需要查看C ++书籍/手册/等中有关“按引用调用”和“按值调用”之间区别的讨论。 Neil的答案是正确的 - 默认是按值调用,但C ++(而不是C)中的函数可以指定一个特定的参数是按引用调用。

另请注意,按值调用可能会导致结构副本:

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

myfoo = f(mybar);

f()按值获取结构(即临时副本由它组成,通常在堆栈上),f()也返回一个复制到mybar中的不同结构。

答案 3 :(得分:0)

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

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