这个C++0x的优化是否合法?

9

一款 C++0x 编译器能否进行优化是合法的吗?

int func(int&& a){
    a = 3;
    return a;
}

为了

int func(int&& a){
    return 3;
}

(或者对于另一个 POD)

1个回答

8

并不是如此,因为该函数必须修改变量a以使其等效。话虽如此,在展开后进行一些微不足道的优化后,结果将是相同的:

int x = func(5);

// pseudo-inlined:
int __temp = 5; // the temporary created by binding 5 to int&&
__temp = 3; // a = 3;
int x = __temp; // return a;

// constant propagation:
int __temp = 5;
__temp = 3;
int x = 3;

// dead-code elimination:
int x = 3;

请注意,这个结果和你使用第二个func定义并内联的结果是一样的,只是因为临时变量没有被使用。这表明这两个函数在一般情况下是不等价的。
int modifyme = 100;
int x = func(std::move(modifyme));

// modifyme must be 3, second function definition wouldn't do that

@GMan:我指的是在调用函数后读取modifyme的值。你说它必须是3。这意味着你可以读取它的值并期望一个定义好的结果。 - Benjamin Lindley
2
@Benjamin:std::move(modifyme)只是static_cast<int&&>(modifyme)的简写,我没有看到标准中有任何暗示从中读取会导致未定义行为的内容,尽管在这方面我了解得不够深入。它只是改变了值类别,仍然是一个常规变量,在我的理解中。 - GManNickG
我想做的事情类似于如果你有一个结构体A {int a [10000];}。然后我想通过A&&将其“所有权”转移给一个函数,以便它可以对其进行优化,就像对本地结构体A一样,即如果不需要存储数组中的值,则不存储。有什么建议吗? - Emil
1
@Emil:嗯,你应该在问题区域内提出你的真正问题。 :) 我不确定你所说的优化是什么;你是指消除别名吗? - GManNickG
@David:GMan说它可以应用,除非该POD类型也被命名,此时它必须将a赋值为3(return a=3)。然而,可能情况是该赋值语句也被优化掉了。 - Mooing Duck
显示剩余10条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接