返回信息流//1. 传值
void fun(int b);
main
{
int a;
fun(a);
}
//2. 函数返回。不举例了。
//3. 传常量引用
void toUpper (const string& str);
char buffer[] = "hazirguo";
toUpper(buffer);
上面举出的是 函数调用时候产生临时变量的3种情况。
但是, 我们也知道,这样的总结是不全面的。比如,
const int &ir = 1024;
这个也会产生临时变量。
谁能完整滴总结一下,什么时候会产生临时变量呢?
这是一条镜像帖。来源:北邮人论坛 / cpp / #81500同步于 2014/8/12
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
c,c++什么时候产生临时变量?讨论
spicewolf
2014/8/12镜像同步6 回复
订阅后,新回复会通过你的通知中心匿名送达。
6 条回复
别太在意这些,优化器都会帮你把多余的变量去掉。
p.s. 所以,交换两个局部变量,甚至全局变量,最好的办法是
int a = 1, b = 2;
int aa = a, bb = b;
a = bb; b = aa;
【 在 spicewolf 的大作中提到: 】
: //1. 传值
: void fun(int b);
: main
: ...................
另一方面,函数调用涉及到calling convention,这不是语言规定的,是平台的application binary interface(ABI)规定的,ABI可以说是“编程语言的实现”的一部分。具体到现在常用的x86-64,谷歌一下“AMD64 ABI”。
根据这个ABI,很多参数可以用寄存器传递,不用在栈上分配内存。有的时候寄存器放不下,需要用内存传递。比如,前6个整数参数可以用寄存器传递,再多就必须用内存了。
有时候,一些参数,即使是“按值传递”的语义,实际上也是在栈上复制一分,然后传引用,然后让被调用者以为是“按值传递”的,修改了内容也不会修改调用者手里的那一份变量,造成一种“按值传递”的假象。
C++里,程序员自己定义了拷贝构造函数或者析构函数的对象,按照AMD64 ABI,都是按上述方法传递“隐形指针”,对象本身在栈上。
谢谢!我先看看
【 在 nuanyangyang 的大作中提到: 】
:
: 另一方面,函数调用涉及到calling convention,这不是语言规定的,是平台的application binary interface(ABI)规定的,ABI可以说是“编程语言的实现”的一部分。具体到现在常用的x86-64,谷歌一下“AMD64 ABI”。
: 根据这个ABI,很多参数可以用寄存器传递,不用在栈上分配内存。有的时候寄存器放不下,需要用内存传递。比如,前6个整数参数可以用寄存器传递,再多就必须用内存了。
: ...................
好的,谢谢
【 在 iFadeToBlack 的大作中提到: 】
: 搜搜copy elimination和return value optimization,stackflow上有一些有意思的帖子