接續之前寫的
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紀錄太頻繁,就失去減少記憶體使用和優化效能的效果

參考資料
https://stackoverflow.com/questions/583076/c-c-changing-the-value-of-a-const
 

創作者介紹
創作者 GNAySolution 的頭像
Yang

GNAySolution

Yang 發表在 痞客邦 留言(0) 人氣( 2 )