天天看點

const和volatile的講解

const定義的變量

先看一段代碼:

#include<stdio.h>
#include<stdlib.h>
int main()
{
    const int n = ;
    n = ;     //可以指派嗎?
    printf("%d\n", n);
    system("pause");
    return ;
}
           
const和volatile的講解

可見const修飾的變量不能被改。

在c語言中,當const修飾一個辨別符的時候,我們說,const依然是一個變量,隻是它具有常屬性,不能被改。

test.c

const int n = ;
    int arr[];
    int arr2[n];//可以嗎?
           
const和volatile的講解

它不能用于表示數組的大小,可見const修飾的n是一個變量。

在c++中,const修飾的辨別符就是常量

const int n = ;
    int arr[];
    int arr2[n];//可以嗎?
           

我們會發現編譯時沒有任何錯誤,

我們在來看一段代碼:

#include<stdio.h>
#include<stdlib.h>
int main()
{
    const int n = ;
    int *p = (int *)&n;
    *p = ;
    printf("%d\n", n);
    system("pause");
    return ;
}
           

看看程式會輸出什麼?

const和volatile的講解

我們看看記憶體中num的變化:

const和volatile的講解

記憶體中的num已經變成了20,但為什麼輸出還是10呢?????

編譯器在編譯期間可能對代碼進行優化。

當編譯器看到這裡的num被const修飾,從語義上講這裡的num是不期望被改變的,那優化的時候就可以把num的值存放到寄存器(用于提高通路效率)中。以後隻要使用num的地方都去寄存器中取,那即使num對應的記憶體中的值發生變化,寄存器也是感覺不到的,是以造成輸出10的結果。

volatile

當我們對代碼進行以下修改:

#include<stdio.h>
#include<stdlib.h>
int main()
{
    volatile const int n = ;
    int *p = (int *)&n;
    *p = ;
    printf("%d\n", n);
    system("pause");
    return ;
}
           

程式又會輸出什麼?

const和volatile的講解

是以volatile起到了關鍵的作用。

volatile的作用:編譯時不優化,執行時不緩存,每次需要從記憶體中讀出(保證記憶體的可見性)。

使用場景:用于多線程或多CPU線程。

繼續閱讀