【发布时间】:2013-04-09 23:56:23
【问题描述】:
如果有一个函数不接受任何引用或指针作为参数,它的返回类型是未使用的,并且它不会进行明显离开系统的调用(I/O 调用、更改系统时间等),是否有保证只修改定义它的类(或根本不修改)?
我能想到的这条规则的唯一例外如下:
void a(int b, int c){
*((int*)b) = c; }
int main() {
int d=1;
a((int)(&d),d+1);
return 0; }
保证会被定义吗?我知道int* 和int 的大小不必相同,但是如果将它们定义为相同的大小,这是否必须起作用,还是仍然是未定义的行为?
目标是看一个函数是否可以合法地优化出来(即如果你能证明它没有副作用,它可以被删除)。
【问题讨论】:
-
@artlessnoise 这更像是stackoverflow.com/questions/15825188/… 之类的东西。此外,这不是死代码,这是什么都不做的活代码。
-
不,我认为(如果我错了,请纠正我)你无法优化它。考虑 b 和 c 是具有共享指针的类的实例,这可能会受到影响。甚至考虑在离开作用域时调用析构函数。
-
@rralf 是有道理的。顺便说一句,行为是否已定义?
-
@soandos 维基百科的文章没有完全解释这一点,但是有许多编译器优化可以检测什么都不做的实时代码。那是死代码。请参阅 wikipedia 和 google 的参考部分。如果编译器研究没有涵盖它,那么我认为你的问题是深奥的。
标签: c++ c++11 undefined-behavior