C++專題:const那點事兒
阿新 • • 發佈:2020-11-13
目錄
1.開門見山
今天聊聊const
,主要想搞清楚幾件事:
const
的幾種使用場景const
的記憶體儲存位置- [轉載]const在C與C++中的區別
2.使用場景
- const修飾內建型別:
// 以下兩種表達是等價的
const int a = 0;
int const b = 1;
a = 1; // 不允許,編譯報錯
b = 2; // 不允許,編譯報錯
- 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 // 不允許
- const修飾函式
int f() const {} // 表示該函式函式不能修改成員變數的值(針對類)
const int f() {} // 表示該函式的返回值,沒什麼意義,函式返回值是匿名臨時變數,函式呼叫完成會銷燬,所以本質上沒有什麼作用
3.記憶體分配
- 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 ........
- 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 ........
- 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
關於這個問題,之前沒有了解過,查詢書籍沒有得到比較滿意的答覆,這裡借用這個小哥哥的博文,自己感覺寫的挺好的,學習一下,後續再驗證。詳情點我