如果有一個函數沒有將任何引用或指針作爲參數,它的返回類型是未使用的,並且它沒有任何可觀察地離開系統的調用(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
不必是相同的大小,但如果他們被定義爲相同的大小,這是否必須工作,或者它仍然是未定義的行爲?
目標是查看功能是否可以合法優化(即如果您可以證明它沒有副作用,可以將其刪除)。
請參閱:[維基百科的死代碼消除](http://en.wikipedia.org/wiki/Dead_code_elimination)和[SO的死代碼](http://stackoverflow.com/questions/4813947/how-can-i -know-其中零件-內式代碼被-從未使用)。 – 2013-04-10 00:03:36
@artlessnoise這是更多關於像http://stackoverflow.com/questions/15825188/removing-useless-lines-from-c-file。此外,這不是死代碼,這是沒有任何作用的實時代碼。 – soandos 2013-04-10 00:08:33
不,我認爲(糾正我,如果我錯了),你不能優化它。考慮一下b和c是具有共享指針的類的實例,這些指針可能會受到影響。甚至考慮一下在離開示波器時發生的析構函數的調用。 – rralf 2013-04-10 00:11:18