返回

内存小知识:揭开复制的真相

前端

栈内存与堆内存

在计算机科学中,内存通常被分为两种类型:栈内存和堆内存。栈内存用于存储局部变量和函数参数,而堆内存用于存储动态分配的数据。

  • 栈内存 :栈内存是一种先进后出(LIFO)的数据结构。这意味着最后存储在栈内存中的数据将首先被取出。栈内存通常用于存储局部变量和函数参数。当函数被调用时,栈内存中会为其局部变量和函数参数分配空间。当函数执行完毕后,栈内存中分配的空间将被释放。
  • 堆内存 :堆内存是一种动态分配的数据结构。这意味着我们可以随时向堆内存中分配空间,也可以随时释放堆内存中分配的空间。堆内存通常用于存储动态分配的数据,例如数组、链表等。

值传递与引用传递

当我们使用赋值运算符(=)时,会发生复制行为。复制行为可以分为值传递和引用传递两种。

  • 值传递 :值传递是指将一个变量的值复制到另一个变量中。例如,以下代码演示了值传递:
int a = 20;
int b = a;

在上面的代码中,变量a的值为20,变量b的值也被赋值为20。但是,变量a与变量b是相互独立的两个变量。这意味着对变量a的任何修改都不会影响变量b,反之亦然。

  • 引用传递 :引用传递是指将一个变量的引用复制到另一个变量中。例如,以下代码演示了引用传递:
int *a = new int(20);
int *b = a;

在上面的代码中,变量a是一个指向整型变量的指针,变量b也是一个指向整型变量的指针。变量a的值是整型变量的地址,变量b的值也是整型变量的地址。这意味着变量a与变量b指向同一个整型变量。对变量a的任何修改都会影响变量b,反之亦然。

复制行为的真相

在栈内存中,数据发生复制行为时,系统会自动为新的变量分配一个新值。例如,以下代码演示了栈内存中的复制行为:

int a = 20;
int b = a;

在上面的代码中,变量a与变量b虽然值都等于20,但是他们其实已经是相互独立互不影响的值了。

在堆内存中,数据发生复制行为时,系统会自动为新的变量分配一个新的引用。例如,以下代码演示了堆内存中的复制行为:

int *a = new int(20);
int *b = a;

在上面的代码中,变量a与变量b虽然指向同一个整型变量,但是他们其实已经是相互独立互不影响的引用了。

结语

在本文中,我们深入探讨了复制行为,揭开了其背后的真相。我们了解到,复制行为可以分为值传递和引用传递两种。在栈内存中,数据发生复制行为时,系统会自动为新的变量分配一个新值。在堆内存中,数据发生复制行为时,系统会自动为新的变量分配一个新的引用。