最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++中如何修改const變量你知道嗎

 更新時間:2022年03月08日 10:42:11   作者:heyabo  
這篇文章主要為大家詳細介紹了C++修改const變量,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助

一、結(jié)論

聲明:不同于C語言的const變量修改問題(可以通過指針間接修改const變量的值),這里只討論C++ 里的const。

C++ const 修飾符,表示常量,即如果以后保證不會修改則聲明為const,否則若要修改,那一開始為什么還要聲明為const呢?

根據(jù)C++標(biāo)準(zhǔn),對于修改const變量,屬于:未定義行為(指行為不可預(yù)測的計算機代碼),這樣一來此行為取決于各種編譯器的具體實現(xiàn)(即不同編譯器可能表現(xiàn)不同)。

故結(jié)論就是:不建議這么做!

但是,是的,但是,網(wǎng)上論壇、博客里均有有關(guān)如何修改const變量的方法,其不是依賴于某種具體的編譯器,就是講的欠考慮。

方法是在定義變量的時候加上volatile關(guān)鍵字(沒有其他方法了嗎(比如,const_cast ...)? 是的,目前為止,我只知道這種方法是可能的):

const volatile int i = 10;

:關(guān)于volatile這里不細講,詳見:volatile 關(guān)鍵字??紤]到volatile的重要性,后面自己也會寫一篇關(guān)于volatile詳解的文章。

二、分析

為了說明問題,下面在三種編譯器環(huán)境下做幾個小實驗

1. g++ 

#include <stdio.h>
int main()
{
    const volatile int i = 10;
    int* pi = (int*)(&i);
    *pi = 100;
    printf("*pi: %d\n",*pi);
    printf("i: %d\n",i);
    printf("pi: %p\n",pi);
    printf("&i: %p\n", &i);
    return 0;
}

輸出結(jié)果:

gdb查看其匯編代碼命令:進入gdb,然后輸入:disass main):

可以看出:輸入*pi 和 i 時均是從堆棧(即內(nèi)存)中取數(shù)的。

反例:把 volatile關(guān)鍵字去掉:

#include <stdio.h>
int main()
{
    const int i = 10;
    int* pi = (int*)(&i);
    *pi = 100;
    printf("*pi: %d\n",*pi);
    printf("i: %d\n",i);
    printf("pi: %p\n",pi);
    printf("&i: %p\n", &i);
    return 0;
}

輸出結(jié)果:

由此可見:在沒有volatile關(guān)鍵字修飾時,const 變量 i 的值時沒有改變的。

運用gdb查看其匯編代碼:

注意此時(沒有加volatile修飾符),輸出 變量 i 的值時直接將 0xa(10)值(從符號表中取出的)輸出,即此處編譯器進行了優(yōu)化,沒有從內(nèi)存中讀。

注意到:指針 pi 和 &i(i 的地址)值卻是一樣的。So ,Why?

這就是C++中的常量折疊:指const變量(即常量)值放在編譯器的符號表中,計算時編譯器直接從表中取值,省去了訪問內(nèi)存的時間,從而達到了優(yōu)化。

而在此基礎(chǔ)上加上volatile修改符,即告訴編譯器該變量屬于易變的,不要對此句進行優(yōu)化,每次計算時要去內(nèi)存中取數(shù)。

這里也有個小細節(jié):每種編譯器對volatile修飾符的修飾作用效果不一致,有的就直接“不理會”,如VC++6.0編譯器(下面會講到)。

2. dev c++

運行結(jié)果與1(g++)一致。

3. VC++ 6.0

(1)添加volatile修飾符時,輸出結(jié)果(程序代碼同上):

 i 的值還是10,沒有改變!這是為什么呢?不急,先看下其匯編代碼:

注意:g++ 匯編代碼的mov指令 與 VC++ 6.0的mov指令不同(傳送方向相反)。

真相大白:雖然定義const變量的同時加上了volatile修飾符,但VC++ 6.0編譯器還是進行了優(yōu)化措施,輸出 i 時 從編譯器的符號表中取值,直接輸出。

(2)無 volatile 修飾符時。輸出結(jié)果:

i 的值沒有改變,預(yù)期中。其匯編代碼為:

結(jié)果與添加volatile時相同。

即在VC++6.0編譯環(huán)境下,在const變量定義時添加volatile修飾符,與不添加效果是一樣的。編譯器都采取了優(yōu)化(甚至把編譯器優(yōu)化選項關(guān)閉還是如此,有點恐怖...)。

4. VS 2010

再看下Microsoft編譯器家族的高級版本:

(1)添加 volatile 修飾符時,輸出結(jié)果:

 i 的值被成功修改了!

(2)無 volatile 修飾符時,輸出結(jié)果:

i 的值沒有被修改。

故:不建議修改const變量的值,即使修改也要熟悉當(dāng)前使用的編譯器對于該 未定義行為 是如何解釋的

總結(jié)

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!  

相關(guān)文章

  • VisualStudio2022下配置 OpenMP多線程編程環(huán)境與運行

    VisualStudio2022下配置 OpenMP多線程編程環(huán)境與運行

    本文主要介紹了VisualStudio2022下配置 OpenMP多線程編程環(huán)境與運行,文中通過圖文介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-06-06
  • 詳解C/C++高精度算法的簡單實現(xiàn)

    詳解C/C++高精度算法的簡單實現(xiàn)

    這篇文章主要為大家詳細介紹了C/C++中高精度算法(加減乘除)的簡單實現(xiàn),方便以后需要時拷貝使用。感興趣的小伙伴可以跟隨小編一起了解一下
    2022-12-12
  • C++堆排序算法實例詳解

    C++堆排序算法實例詳解

    這篇文章主要介紹了C++堆排序算法,簡單分析了堆排序算法的原理并結(jié)合實例形式分析了C++實現(xiàn)堆排序的具體操作技巧,需要的朋友可以參考下
    2017-08-08
  • C語言線程對象和線程存儲的實現(xiàn)

    C語言線程對象和線程存儲的實現(xiàn)

    這篇文章主要介紹了C語言線程對象和線程存儲的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • C語言程序設(shè)計之指針的應(yīng)用詳解

    C語言程序設(shè)計之指針的應(yīng)用詳解

    為了讓大家能夠更準(zhǔn)確的了解C語言中指針的使用,本文為大家準(zhǔn)備了四個指針相關(guān)的例題,文中的示例代碼講解詳細,感興趣的小伙伴可以學(xué)習(xí)一下
    2022-11-11
  • C語言實現(xiàn)萬年歷小功能

    C語言實現(xiàn)萬年歷小功能

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)萬年歷小功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • c++將vector迭代器轉(zhuǎn)換為指針的實現(xiàn)方式

    c++將vector迭代器轉(zhuǎn)換為指針的實現(xiàn)方式

    這篇文章主要介紹了c++將vector迭代器轉(zhuǎn)換為指針的實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • 探究一下C語言生成隨機數(shù)的奧秘

    探究一下C語言生成隨機數(shù)的奧秘

    C語言中生成隨機數(shù)是一項非常重要的功能,因為許多現(xiàn)代應(yīng)用程序需要使用隨機數(shù)。本文就來帶大家一起探究一下C語言生成隨機數(shù)的奧秘吧
    2023-03-03
  • C語言每日練習(xí)之二叉堆

    C語言每日練習(xí)之二叉堆

    這篇文章主要為大家介紹了C語言二叉堆,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • C++使用ifstream讀取文件內(nèi)容的示例詳解

    C++使用ifstream讀取文件內(nèi)容的示例詳解

    這篇文章主要為大家詳細介紹了C++如何使用ifstream讀取文件內(nèi)容的功能,文中的示例代碼講解詳細,具有一定的參考價值,感興趣的可以了解一下
    2023-03-03

最新評論

海宁市| 汕尾市| 湖口县| 普定县| 嵩明县| 专栏| 革吉县| 安塞县| 大化| 绥化市| 德令哈市| 泰安市| 勐海县| 子长县| 浑源县| 会泽县| 乌恰县| 泰州市| 安远县| 济南市| 即墨市| 利津县| 江西省| 潜山县| 卫辉市| 开鲁县| 如东县| 望奎县| 蓬莱市| 杭锦后旗| 三原县| 塔城市| 娱乐| 阳城县| 伊宁市| 舒兰市| 大同县| 循化| 云霄县| 赤峰市| 阳原县|