由于范围问题,我对此感到疑惑。例如,考虑下面的代码
typedef struct {
int x1;/*top*/
int x2;/*bottom*/
int id;
} subline_t;
subline_t subline(int x1, int x2, int id) {
subline_t t = { x1, x2, id };
return t;
}
int main(){
subline_t line = subline(0,0,0); //is line garbage or isn't it? the reference
//to subline_t t goes out of scope, so the only way this wouldn't be garbage
//is if return copies
}
所以我的问题是,返回语句会一直被复制吗?在这种情况下,它似乎是有效的,所以我相信return确实是复制的。如果它复制了,它会在每种情况下都复制吗?
发布于 2009-10-07 04:18:50
是的,那样的话会复印一份。如果您像这样更改函数声明:
subline_t &subline(int x1, int x2, int id) {
则不会创建任何副本。但是,在您的特定情况下,返回对堆栈上分配的对象的引用是无效的。问题是,在调用者有机会使用对象之前,对象就会被析构和失效。
这与C++的通用Return Value Optimization相关,在您所描述的情况下,它可以避免执行实际的复制操作。最终结果(或应该是)与复制完成的结果相同,但您应该意识到优化。在某些情况下,这种优化的存在可能会改变程序的可观察行为。
发布于 2009-10-07 04:18:32
在本例中,它将返回一个副本
如果你的代码是
subline_t& subline(int, int)
然后,它将返回一个引用,这将产生未定义的行为。
发布于 2009-10-07 04:20:10
是的,对于声明返回struct
的函数,这样的结构的return
将复制它(尽管编译器有权优化复制,但基本上在它可以证明优化在语义上是无害的情况下,您可以推断“好像”复制是有保证的)。
但是,既然您已经将其标记为C++,而不是C,为什么不为您的struct
提供一个构造函数,而不是...?看起来更清晰、更直接...!-)
https://stackoverflow.com/questions/1529447
复制相似问题