1. 程式人生 > 實用技巧 >C++專題:const那點事兒

C++專題:const那點事兒

目錄

1.開門見山

今天聊聊const,主要想搞清楚幾件事:

  1. const的幾種使用場景
  2. const的記憶體儲存位置
  3. [轉載]const在C與C++中的區別

2.使用場景

  1. const修飾內建型別:
// 以下兩種表達是等價的
const int a = 0;
int const b = 1;

a = 1;  // 不允許,編譯報錯
b = 2;  // 不允許,編譯報錯
  1. const修飾指標
int age = 1;
const int *p = &age;   // 不能使用p修改其指向的記憶體,*p是常量
int* const q = &age;   // 不能改變指標指向的位置,q是常量


int sage = 2;
p = &sage;   // 允許
*p = 3;     // 不允許

*q = 4;     // 允許
q = &sage   // 不允許
  1. const修飾函式
int f() const {}    // 表示該函式函式不能修改成員變數的值(針對類)

const int f() {}    // 表示該函式的返回值,沒什麼意義,函式返回值是匿名臨時變數,函式呼叫完成會銷燬,所以本質上沒有什麼作用

3.記憶體分配

  1. const修飾全域性變數
#include <iostream>

using namespace std;

const int a = 0;

int main() {
}

彙編程式碼如下:

a.out:	file format Mach-O 64-bit x86-64


Disassembly of section __TEXT,__text:

0000000100000fb0 _main:
100000fb0: 55                          	pushq	%rbp
100000fb1: 48 89 e5                    	movq	%rsp, %rbp
100000fb4: 31 c0                       	xorl	%eax, %eax
100000fb6: 5d                          	popq	%rbp
100000fb7: c3                          	retq
Contents of section __text:
 100000fb0 554889e5 31c05dc3                    UH..1.].
Contents of section __unwind_info:
 100000fb8 01000000 1c000000 00000000 1c000000  ................
 100000fc8 00000000 1c000000 02000000 b00f0000  ................
 100000fd8 34000000 34000000 b90f0000 00000000  4...4...........
 100000fe8 34000000 03000000 0c000100 10000100  4...............
 100000ff8 00000000 00000001                    ........
  1. extern修飾const全域性變數
#include <iostream>

using namespace std;

extern const int a = 888;
int main() {
}

彙編程式碼如下:

a.out:	file format Mach-O 64-bit x86-64

Disassembly of section __TEXT,__text:

0000000100000fa0 _main:
100000fa0: 55                          	pushq	%rbp
100000fa1: 48 89 e5                    	movq	%rsp, %rbp
100000fa4: 31 c0                       	xorl	%eax, %eax
100000fa6: 5d                          	popq	%rbp
100000fa7: c3                          	retq
Contents of section __text:
 100000fa0 554889e5 31c05dc3                    UH..1.].
// 區別在這,應該是靜態儲存區的已初始化資料段(佔用記憶體)
Contents of section __const:
 100000fa8 78030000                             x...
Contents of section __unwind_info:
 100000fac 01000000 1c000000 00000000 1c000000  ................
 100000fbc 00000000 1c000000 02000000 a00f0000  ................
 100000fcc 34000000 34000000 a90f0000 00000000  4...4...........
 100000fdc 34000000 03000000 0c000100 10000100  4...............
 100000fec 00000000 00000001                    ........
  1. const修飾區域性變數
#include <iostream>

using namespace std;

int main() {
    const int a = 888;
}

彙編程式碼如下:

a.out:	file format Mach-O 64-bit x86-64


Disassembly of section __TEXT,__text:

0000000100000fa0 _main:
100000fa0: 55                          	pushq	%rbp
100000fa1: 48 89 e5                    	movq	%rsp, %rbp
100000fa4: 31 c0                       	xorl	%eax, %eax
 // 區別在這,區域性變數是分配了記憶體的,將0賦值給棧中的變數(佔用棧空間)
100000fa6: c7 45 fc 00 00 00 00        	movl	$0, -4(%rbp)
100000fad: 5d                          	popq	%rbp
100000fae: c3                          	retq
Contents of section __text:
 100000fa0 554889e5 31c0c745 fc000000 005dc3    UH..1..E.....].
Contents of section __unwind_info:
 100000fb0 01000000 1c000000 00000000 1c000000  ................
 100000fc0 00000000 1c000000 02000000 a00f0000  ................
 100000fd0 34000000 34000000 b00f0000 00000000  4...4...........
 100000fe0 34000000 03000000 0c000100 10000100  4...............
 100000ff0 00000000 00000001                    ........

4.C vs C++的const

關於這個問題,之前沒有了解過,查詢書籍沒有得到比較滿意的答覆,這裡借用這個小哥哥的博文,自己感覺寫的挺好的,學習一下,後續再驗證。詳情點我