【发布时间】:2013-06-27 08:34:44
【问题描述】:
我想知道编译器是否有可能完成这些场景?
首先我们将 SomeDataType 定义为:
struct SomeDataType{
public:
int a;
int b;
int c;
};
场景#1_关于具有如下引用参数的被调用函数:
void doSomething(SomeDataType & input){
...
}
假设该函数不是内联的,并且只有调用函数范围内的变量在程序中传递给该函数,并且考虑到引用不一定是指针这一事实,放置输入参数的内存部分是共享的在任何调用函数的堆栈帧和“doSomething”被调用函数的堆栈帧之间,以便“doSomething”可以像寻址其本地范围内的任何局部变量一样寻址该参数,即通过将偏移量添加到确定起始地址的基指针它的堆栈帧。
场景#2_这对我来说似乎更不可能,但无论如何;关于返回“SomeDataType”类型结构的被调用函数:
SomeDataType doSomething(){
SomeDataType someStruct;
...
return someStruct;
};
结构“someStruct”所在的内存部分在任何调用者的堆栈帧和“doSomething”被调用函数的堆栈帧之间共享,因此请考虑调用函数中的以下语句:
SomeDataType TheStruct=doSomething();
在调用者的范围内使用“TheStruct”会导致使用与被调用者范围内的“SomeStruct”相同的内存部分,这意味着被调用者函数不会在任何地方复制“someStruct”,即使复制是必要的就像在调用者函数中有如下语句表明目标不是调用者范围内的结构:
*pntrToSomewhere=doSomething();
调用者的职责是将该共享部分的内容复制到该指针指示的位置。
【问题讨论】:
-
你是在谈论 RVO 吗?
-
@PlasmaHH 绝对没有
标签: c++ function memory-management compiler-construction stack-frame