当前位置: 首页> 游戏> 攻略 > 重庆建站程序_莱芜金点子信息港房屋出租_做一个网站_十八大禁用黄app入口

重庆建站程序_莱芜金点子信息港房屋出租_做一个网站_十八大禁用黄app入口

时间:2025/7/11 1:33:08来源:https://blog.csdn.net/yuanbenshidiaos/article/details/144678454 浏览次数:0次
重庆建站程序_莱芜金点子信息港房屋出租_做一个网站_十八大禁用黄app入口
  1. 栈帧的创建与销毁

    • 栈帧创建过程
      • 当一个函数被调用时,系统会在程序的栈空间中为该函数创建一个栈帧。首先,会将函数的返回地址(即调用该函数的下一条指令的地址)压入栈中,这确保函数执行完后能回到正确的位置继续执行后续代码。然后,根据函数参数的类型和数量,将参数的值(如果是值传递)或引用(如果是引用传递)或指针(如果是指针传递)依次压入栈中。最后,为函数内部定义的局部变量分配内存空间。
      • 例如,有函数void func(int a, int b),当调用func(3, 4)时,系统会先将返回地址压入栈,然后将34压入栈作为参数ab的值,接着为func函数内部可能定义的局部变量预留空间。
    • 栈帧销毁过程
      • 当函数执行结束(遇到return语句或者函数体的最后一个花括号)时,栈帧会被销毁。首先,会释放函数内部局部变量所占用的内存空间。然后,根据函数的返回值类型(如果有返回值),将返回值复制到一个临时存储位置(如果是基本数据类型)或者通过移动语义(如果是对象)将返回值传递给调用者。最后,将栈顶指针恢复到调用该函数之前的位置,这样就相当于销毁了这个栈帧,同时将返回地址从栈中弹出,程序继续从返回地址处执行。
  2. 参数传递方式的细节

    • 值传递深入理解
      • 复制过程:在值传递中,实际参数的值会被完整地复制到函数的形式参数中。对于基本数据类型,这是一个简单的字节复制过程。例如,传递一个int类型的参数,会将该int值的字节序列复制到函数参数对应的内存位置。对于自定义结构体等复杂类型,会递归地复制每个成员变量的值。
      • 对原始参数的影响:由于是复制了一份新的值给函数参数,所以在函数内部对参数的修改不会影响到原始的实际参数。例如,对于函数void modify(int num),在函数内部num = 10,但如果在函数外部有int original_num = 5; modify(original_num);original_num的值依然是5
    • 引用传递深入理解
      • 引用的本质:引用在底层实现上可以看作是一个指针常量,它总是指向被引用的对象。当进行引用传递时,实际上传递的是对象的地址,但是在语法上使用起来就像使用原始对象一样。例如,int& ref = original_num;reforiginal_num在内存中指向同一个位置。
      • 对原始参数的影响:因为引用和原始对象共享同一块内存空间,所以在函数内部通过引用对参数进行操作,实际上就是对原始对象进行操作。例如,函数void modifyByReference(int& num),在函数内部num = 10,如果在函数外部有int original_num = 5; modifyByReference(original_num);original_num的值会变为10
    • 指针传递深入理解
      • 指针的操作方式:指针传递是把变量的地址传递给函数。在函数内部,通过解引用指针(使用*操作符)来访问和修改指针所指向的变量的值。例如,函数void modifyByPointer(int* ptr),当传递&original_num作为参数时,在函数内部通过*ptr = 10来修改original_num的值。
      • 与引用传递的区别:虽然指针传递和引用传递都可以在函数内部修改原始变量的值,但指针传递需要显式地解引用指针来访问变量,而引用传递在语法上更简洁,直接使用引用变量就可以访问和修改原始变量。另外,指针可以在函数内部重新赋值指向其他对象,而引用一旦初始化就不能再引用其他对象。
  3. 函数返回值传递机制的细节

    • 基本数据类型返回值传递
      • 复制返回值:当函数返回一个基本数据类型(如intdouble等)的值时,函数会将返回值复制到一个临时存储位置。这个临时存储位置可能是一个寄存器或者栈中的某个位置,具体取决于编译器和硬件架构。例如,对于函数int add(int a, int b) { return a + b; },当调用add函数时,计算a + b的结果会被复制到这个临时位置,然后这个值再被赋值给接收返回值的变量(如int result = add(3, 5);中的result)。
    • 对象返回值传递
      • 返回值优化(RVO):当函数返回一个对象时,C++编译器可能会应用返回值优化。在没有返回值优化的情况下,函数会先创建一个临时对象,将函数内部的对象复制到这个临时对象中(通过调用复制构造函数),然后返回这个临时对象。但是,通过返回值优化,编译器可以直接将函数内部的对象构造到接收返回值的对象的内存空间中,避免了不必要的复制操作。例如,对于函数MyClass createObject(),如果MyClass是一个自定义类,在合适的条件下,编译器会直接将createObject函数内部构造的MyClass对象构造到接收返回值的MyClass对象中,而不是先复制到一个临时对象再进行赋值。
      • 移动语义(Move Semantics):如果编译器没有进行返回值优化,除了复制构造函数外,C++还提供了移动构造函数来更高效地处理对象返回值。移动构造函数允许将一个对象的资源(如动态分配的内存)“移动”到另一个对象中,而不是进行复制。例如,对于一个包含动态分配数组的类,移动构造函数可以将数组的指针从一个对象转移到另一个对象,避免了重新分配内存和复制数组元素的开销。当函数返回对象时,编译器可能会优先调用移动构造函数(如果定义了)来提高效率。
        在这里插入图片描述
        下面是一些代码示例,用来展示 C++ 函数的调用机制,包括栈帧、参数传递以及返回值传递相关内容:
#include <iostream>// 用于展示栈帧中的局部变量
void localVarDemo() {int localVar = 10;std::cout << "局部变量 localVar 的值: " << localVar << std::endl;
}// 值传递示例
void valuePassing(int num) {num = 20;std::cout << "值传递中函数内 num 的值: " << num << std::endl;
}// 引用传递示例
void referencePassing(int& num) {num = 30;std::cout << "引用传递中函数内 num 的值: " << num << std::endl;
}// 指针传递示例
void pointerPassing(int* num) {*num = 40;std::cout << "指针传递中函数内 *num 的值: " << *num << std::endl;
}// 返回基本数据类型示例
int returnBasicType() {return 50;
}// 简单类定义,用于展示对象返回
class MyClass {
public:int data;MyClass(int value) : data(value) {}
};// 返回对象示例
MyClass returnObject() {MyClass obj(60);return obj;
}int main() {// 栈帧中的局部变量演示localVarDemo();int value = 15;// 值传递valuePassing(value);std::cout << "值传递后 value 的值: " << value << std::endl;// 引用传递referencePassing(value);std::cout << "引用传递后 value 的值: " << value << std::endl;// 指针传递pointerPassing(&value);std::cout << "指针传递后 value 的值: " << value << std::endl;// 返回基本数据类型int basicResult = returnBasicType();std::cout << "返回基本数据类型的结果: " << basicResult << std::endl;// 返回对象MyClass objResult = returnObject();std::cout << "返回对象的 data 值: " << objResult.data << std::endl;return 0;
}

代码解释:

  • localVarDemo 函数展示了在栈帧中定义和使用局部变量,函数执行时会创建栈帧来存放 localVar
  • valuePassing 是值传递示例,函数接收参数的副本,所以内部修改不影响外部变量。
  • referencePassing 利用引用传递,函数形参是实参的别名,内部修改会同步到外部变量。
  • pointerPassing 通过指针传递,传递变量地址,函数可通过解引用修改外部变量的值。
  • returnBasicType 返回基本数据类型,返回值被复制给 basicResult
  • returnObject 返回自定义类对象,编译器可能会进行返回值优化,高效地把对象传递给 objResult
    在这里插入图片描述
关键字:重庆建站程序_莱芜金点子信息港房屋出租_做一个网站_十八大禁用黄app入口

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: