|
一、const常量分析 1、 #include <stdio.h> const bufsize = 100; char buf[bufsize]; int main() { return 0; } 編譯:gcc -c test.c 報錯:test.c:3: error: variably modified 'buf’ at file scope 2、把buf定義到main函數(shù)中 #include <stdio.h> const bufsize = 100; int main() { char buf[bufsize]; return 0; } 編譯:gcc -c test.c 通過 查看二進(jìn)制文件:objdump -s test.o Contents of section .text: 0000 8d4c2404 83e4f0ff 71fc5589 e5575653 .L$.....q.U..WVS 0010 5183ec38 65a11400 00008945 e431c089 Q..8e......E.1.. 0020 e08945d4 a1000000 0083e801 8945e0a1 ..E..........E.. 0030 00000000 ba000000 0089c180 e5ff89d3 ................ 0040 83e30f89 c889da0f a4c203c1 e00389c6 ................ 0050 83e6ff89 d783e70f 89f089fa a1000000 ................ 0060 00ba0000 000089c1 80e5ff89 4dc889d1 ............M... 0070 83e10f89 4dcc8b45 c88b55cc 0fa4c203 ....M..E..U..... 0080 c1e00389 c180e5ff 894dc089 d183e10f .........M...... 0090 894dc48b 45c08b55 c4a10000 000083c0 .M..E..U........ 00a0 0f83c00f c1e804c1 e00429c4 89e083c0 ..........)..... 00b0 0fc1e804 c1e00489 45dcb800 0000008b ........E....... 00c0 65d48b55 e4653315 14000000 7405e8fc e..U.e3.....t... 00d0 ffffff8d 65f083c4 00595b5e 5f5d8d61 ....e....Y[^_].a 00e0 fcc3 .. Contents of section .rodata: 0000 64000000 d... Contents of section .comment: 0000 00474343 3a202855 62756e74 7520342e .GCC: (Ubuntu 4. 0010 342e332d 34756275 6e747535 2e312920 4.3-4ubuntu5.1) 0020 342e342e 3300 4.4.3. 從輸出可以看出:全局定義的const常量是要占用內(nèi)存的 3、都在main中定義 #include <stdio.h> int main() { const bufsize = 100; char buf[bufsize]; return 0; } 編譯:gcc -c test.c 通過 查看二進(jìn)制文件:objdump -s test.o Contents of section .text: 0000 8d4c2404 83e4f0ff 71fc5589 e5575653 .L$.....q.U..WVS 0010 5183ec38 65a11400 00008945 e431c089 Q..8e......E.1.. 0020 e08945d4 c745e064 0000008b 45e083e8 ..E..E.d....E... 0030 018945dc 8b45e0ba 00000000 89c180e5 ..E..E.......... 0040 ff89d383 e30f89c8 89da0fa4 c203c1e0 ................ 0050 0389c683 e6ff89d7 83e70f89 f089fa8b ................ 0060 45e0ba00 00000089 c180e5ff 894dc889 E............M.. 0070 d183e10f 894dcc8b 45c88b55 cc0fa4c2 .....M..E..U.... 0080 03c1e003 89c180e5 ff894dc0 89d183e1 ..........M..... 0090 0f894dc4 8b45c08b 55c48b45 e083c00f ..M..E..U..E.... 00a0 83c00fc1 e804c1e0 0429c489 e083c00f .........)...... 00b0 c1e804c1 e0048945 d8b80000 00008b65 .......E.......e 00c0 d48b55e4 65331514 00000074 05e8fcff ..U.e3.....t.... 00d0 ffff8d65 f083c400 595b5e5f 5d8d61fc ...e....Y[^_].a. 00e0 c3 . Contents of section .comment: 0000 00474343 3a202855 62756e74 7520342e .GCC: (Ubuntu 4. 0010 342e332d 34756275 6e747535 2e312920 4.3-4ubuntu5.1) 0020 342e342e 3300 4.4.3. 注意:在main中定義的const常量是不占內(nèi)存的 二、const變量 1、 #include <stdio.h> const int bufsize = 100; char buf[bufsize]; int main() { return 0; } 和一、1中const常量同樣的問題:test.c:3: error: variably modified 'buf’ at file scope 2、 #include <stdio.h> const int bufsize = 100; int main() { char buf[bufsize]; return 0; } Contents of section .text: 0000 8d4c2404 83e4f0ff 71fc5589 e5575653 .L$.....q.U..WVS 0010 5183ec38 65a11400 00008945 e431c089 Q..8e......E.1.. 0020 e08945d4 a1000000 0083e801 8945e0a1 ..E..........E.. 0030 00000000 ba000000 0089c180 e5ff89d3 ................ 0040 83e30f89 c889da0f a4c203c1 e00389c6 ................ 0050 83e6ff89 d783e70f 89f089fa a1000000 ................ 0060 00ba0000 000089c1 80e5ff89 4dc889d1 ............M... 0070 83e10f89 4dcc8b45 c88b55cc 0fa4c203 ....M..E..U..... 0080 c1e00389 c180e5ff 894dc089 d183e10f .........M...... 0090 894dc48b 45c08b55 c4a10000 000083c0 .M..E..U........ 00a0 0f83c00f c1e804c1 e00429c4 89e083c0 ..........)..... 00b0 0fc1e804 c1e00489 45dcb800 0000008b ........E....... 00c0 65d48b55 e4653315 14000000 7405e8fc e..U.e3.....t... 00d0 ffffff8d 65f083c4 00595b5e 5f5d8d61 ....e....Y[^_].a 00e0 fcc3 .. Contents of section .rodata: 0000 64000000 d... 注意:和const常量一樣,全局定義的const變量是要占用內(nèi)存的 3、 #include <stdio.h> int main() { const int bufsize = 100; char buf[bufsize]; return 0; } 注意:和const常量一樣,在main中定義的const變量是不占內(nèi)存的 總結(jié): a、全局定義的const常量和const變量鏈接的時候都要占用內(nèi)存,且存放在只讀數(shù)據(jù)段(.rodata) b、局部定義的const常量和const變量鏈接的時候都不占內(nèi)存,運(yùn)行的時候在棧上分配空間。 const常量和#define常量比較: a、const常量有數(shù)據(jù)類型,而宏常量沒有數(shù)據(jù)類型; b、有些集成化的調(diào)試環(huán)境工具可以對const常量進(jìn)行調(diào)試,但不能對宏常量進(jìn)行調(diào)試。 在C++中:編譯器會為常量分配了地址,但是在使用常量的時候,常量會被一立即數(shù)替換(保護(hù)常量,防止被破壞性修改) 在C++中對于基本類型的常量,編繹器并不為其分配存儲空間,編譯器會把它放到符號表,當(dāng)取符號常量的地址等操作時,將強(qiáng)迫編譯器為這些常量分配存儲空間,編譯器會重新在內(nèi)存中創(chuàng)建一個它的拷貝,通過地址訪問到的就是這個拷貝而非原始的符號常量。 而在C語言中沒有常量折疊。 |
|
|