004_C語言--變量限定

簡介

上一篇文章我們通過反彙編看看unsigned和signed關鍵字。發現最終生成的可執行文件是沒有unsigned和signed的概念。我自己將unsigned和signed叫做變量的屬性修飾詞。
此篇我們通過反彙編看一看const、volatile、restrict(暫不管)。我自己將const、volatile、restrict叫做變量的限定修飾詞。

不變性

關鍵字const告訴編譯器,該變量被限定爲不能通過賦值、增量運算來修改該變量的值。
在聲明一個簡單的變量和數組時使用關鍵字const很簡單。
聲明指針則要複雜一點,我們需要區分是讓指針本身成爲const還是指針指向的值成爲const。
口訣:左數右指:當const出現在*的左邊時,指針指向的數爲常量;當const出現在*的右邊時,指針本身爲常量。

創建const.c程序

const int A1;
const int A2 = 0xA2;
int A3;
int A4 = 0xA4;
int main()
{
    const int B5;
    int B6 = 0xB6;
    int B7;
    const int B8 = 0xB8;
    
    return 0;
}

改寫Makefile文件,在linux環境下執行make執行得到反彙編文件。

查看const_o.txt文件

const.o:     file format elf64-x86-64


Disassembly of section .text:

0000000000000000 <main>:
   0:	55                   	push   %rbp
   1:	48 89 e5             	mov    %rsp,%rbp
   4:	c7 45 f8 b6 00 00 00 	movl   $0xb6,-0x8(%rbp)
   b:	c7 45 fc b8 00 00 00 	movl   $0xb8,-0x4(%rbp)
  12:	b8 00 00 00 00       	mov    $0x0,%eax
  17:	5d                   	pop    %rbp
  18:	c3                   	retq   

通過之前所學,我們將關鍵的彙編代碼選出進行對比學習 :

  4:	c7 45 f8 b6 00 00 00 	movl   $0xb6,-0x8(%rbp)     //int B6 = 0xB6;
  b:	c7 45 fc b7 00 00 00 	movl   $0xb8,-0x4(%rbp)     //const int B8 = 0xB8;

神奇神奇真神奇。兩句話一模一樣的。
思考:

const int A1;
const int A2 = 0xA2;
int A3;
int A4 = 0xA4;
const int B5;
int B7;

神奇神奇真神奇。此部分代碼怎麼不見了?
請看此文(還未開坑,後續會有專門的文章總結問題)。

易變性

關鍵字volatile告訴編譯器,該變量除了可以被程序改變以外還可以被其他代理改變。語法同const。
關於voloatile的使用,多用於嵌入式硬件開發和多線程之間的變量。
因例子牽涉內容知識過多,暫時不進行分析。
只需知道,當一個變量可能被其他代理改變時,請加上改關鍵字。表明,你這個編譯器啊,別給我搞懂搞西了。每次獲取變量值,都給我老老實實的去內存中讀取。

指針唯一性

關鍵字restrict只可以用於指針,表明指針是訪問一個數據對象的唯一且初始的方式。也暫時不做過多深入。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章