《函数调用时参数、返回值所做的优化处理+编译器NRV优化》
2017-07-22 01:39
423 查看
摘要:
c++中创建对象以及销毁对象时,会自动调用对象的构造、析构函数(默认的或自定义的),因此,当我们在c++中调用函数时应该特别注意传参以及返回值时的优化处理,以减少构造、析构函数调用时的开销。同时编译器也会针对不同情况的函数调用,在不产生错误的情况下采用“NRV优化”(函数返回时,不产生临时变量)。
示例代码:
传值调用、传值返回:
传引用调用、引用返回:
NRV编译优化:
[b]参考答案:
正确否?
标准答案:
详解:
c++中创建对象以及销毁对象时,会自动调用对象的构造、析构函数(默认的或自定义的),因此,当我们在c++中调用函数时应该特别注意传参以及返回值时的优化处理,以减少构造、析构函数调用时的开销。同时编译器也会针对不同情况的函数调用,在不产生错误的情况下采用“NRV优化”(函数返回时,不产生临时变量)。
示例代码:
#include<iostream> using namespace std; class AA { public: AA(int a = 10) :_a(a) { cout << "AA(int a = 10)"<< endl; } AA(const AA& s) :_a(s._a) { cout << "AA(const AA& s)" << endl; } ~AA() { cout << "~AA()" << endl; } private: int _a; }; AA& Test(AA& s) { return s; } int main() { AA a(5); Test(a); return 0; }
传值调用、传值返回:
传引用调用、引用返回:
NRV编译优化:
//题目: //Test1中调用了___次AA的拷贝构造函数, ___次AA的赋值运算符函数的重载。 //Test2中调用了___次AA的拷贝构造函数, ___次AA的赋值运算符函数的重载。 //Test3中调用了___次AA的拷贝构造函数, ___次AA的赋值运算符函数的重载。 // #include<iostream> using namespace std; class AA {}; AA f(AA a) { return a; } void Test1() { AA a1; a1 = f(a1); } void Test2() { AA a1; AA a2 = f(a1); } void Test3() { AA a1; AA a2 = f(f(a1)); } int main() { Test1(); Test2(); Test3(); return 0; }
[b]参考答案:
//Test1中调用了_2_次AA的拷贝构造函数, _1_次AA的赋值运算符函数的重载。 //Test2中调用了_3_次AA的拷贝构造函数, _0_次AA的赋值运算符函数的重载。 //Test3中调用了_5_次AA的拷贝构造函数, _0_次AA的赋值运算符函数的重载。
正确否?
标准答案:
//Test1中调用了_2_次AA的拷贝构造函数, _1_次AA的赋值运算符函数的重载。 //Test2中调用了_2_次AA的拷贝构造函数, _0_次AA的赋值运算符函数的重载。 //Test3中调用了_3_次AA的拷贝构造函数, _0_次AA的赋值运算符函数的重载。
详解:
相关文章推荐
- JNI实现回调| JNI调用JAVA函数|参数和返回值的格式
- $.each的使用——对数组调用fn函数处理,没有返回值
- C语言学习4: 函数返回值与传入参数,关于函数值传递和类型隐性转换,变量不同的作用域,static变量,多文件编译例如两个C文件,显示函数调用语句跳转,递归,斐波那契数列,多文件编译相同变量的问题。
- VC 解决 函数调用报错:未经处理的异常: 0xC00000FD: Stack overflow (参数: 0x00000000, 0x06442000)。
- C语言学习12:带参数的main函数,无指定的函数形参,调用库函数处理无指定的函数形参,
- X86和ARM:函数调用参数传递和返回值
- va_list,va_start,va_end处理不定参数函数调用不定参数函数的问题
- Python学习笔记(10)-函数-函数定义、调用、参数、返回值、嵌
- 讨论构造拷贝构造的N中调用情况&&总结C++对传参合传返回值时构造的优化处理。
- Python学习笔记(10)-函数-函数定义、调用、参数、返回值、嵌
- PHP入门教程之自定义函数用法详解(创建,调用,变量,参数,返回值等)
- 编译时推导函数调用约定、常量性、返回值、参数等函数类型特征
- x64 调用约定,参数传递以及函数返回值
- c#带参数和返回值的函数 开启线程调用的方法
- JNI实现回调| JNI调用JAVA函数|参数和返回值的格式
- 函数定义,调用,参数,返回值
- 实现函数 functionFunction,调用之后满足如下条件: 1、返回值为一个函数 f 2、调用返回的函数 f,返回值为按照调用顺序的参数拼接,拼接字符为英文逗号加一个空格,即 ', ' 3、所
- JNI实现回调| JNI调用JAVA函数|参数和返回值的格式
- 函数调用中参数和返回值的拷贝
- windbg查看函数参数,调用堆栈,及返回值.