首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >是否返回语句复制值

是否返回语句复制值
EN

Stack Overflow用户
提问于 2009-10-07 04:15:45
回答 9查看 50.7K关注 0票数 72

由于范围问题,我对此感到疑惑。例如,考虑下面的代码

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确实是复制的。如果它复制了,它会在每种情况下都复制吗?

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2009-10-07 04:18:50

是的,那样的话会复印一份。如果您像这样更改函数声明:

subline_t &subline(int x1, int x2, int id) {

则不会创建任何副本。但是,在您的特定情况下,返回对堆栈上分配的对象的引用是无效的。问题是,在调用者有机会使用对象之前,对象就会被析构和失效。

这与C++的通用Return Value Optimization相关,在您所描述的情况下,它可以避免执行实际的复制操作。最终结果(或应该是)与复制完成的结果相同,但您应该意识到优化。在某些情况下,这种优化的存在可能会改变程序的可观察行为。

票数 51
EN

Stack Overflow用户

发布于 2009-10-07 04:18:32

在本例中,它将返回一个副本

如果你的代码是

subline_t& subline(int, int)

然后,它将返回一个引用,这将产生未定义的行为。

票数 4
EN

Stack Overflow用户

发布于 2009-10-07 04:20:10

是的,对于声明返回struct的函数,这样的结构的return将复制它(尽管编译器有权优化复制,但基本上在它可以证明优化在语义上是无害的情况下,您可以推断“好像”复制是有保证的)。

但是,既然您已经将其标记为C++,而不是C,为什么不为您的struct提供一个构造函数,而不是...?看起来更清晰、更直接...!-)

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1529447

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档