接續之前寫的
in 參數修飾詞 (C# 7.2以上支援)
C語言上常見寫成
const T& input
因為少了建立新的記憶體以及複製資料的動作,能減少程式的記憶體使用以及優化效能
但是,const看似唯讀,其實還是可以利用指標去修改變數值,要很小心
範例程式碼:
void ChangeConst(const int& source, const int& addValue)
{
//如果直接改source值,編譯時會跳錯,但轉成指標後再改即沒問題
int *ptr = (int *)&source;
*ptr = source + addValue;
}
const int MyPID = getpid();
int main(const int argc, const char *argv[])
{
printf("MyPID=%d\n", MyPID);
printf("MyPID=0x%08X\n\n", MyPID);
ChangeConst(MyPID, 1);
printf("MyPID=%d\n", MyPID);
printf("MyPID=0x%08X\n\n", MyPID);
return EXIT_SUCCESS;
}
輸出:
MyPID=5226
MyPID=0x0000146A
MyPID=5227
MyPID=0x0000146B
ChangeConst可以是任何其他函式,尤其來自於第三方,要特別小心,要惡搞太容易
內部可以寫成平常時候都是正常的運算,只有在特別的條件或時間下,再搞破壞
神不知鬼不覺,因為平常時候測試都沒問題
在工作中遇到這種狀況,使用第三方函式庫的人員和單位會被檢討到翻,從此黑掉
要如何避免這種狀況?難,C的指標太強太萬能
一般是在呼叫第三方函式庫的前後,詳細紀錄log,出問題時再詳細檢查推敲,找到出問題的地方
但log紀錄太頻繁,就失去減少記憶體使用和優化效能的效果
參考資料