C++专题:const那点事儿


    限定符const是老生常谈的话题了,不管是面试还是平时工作都会经常遇到,你真的对它了解了么?我这里主要是从三个维度进行总结,并进行实例验证。

一.使用场景

  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() {}    // 表示该函数的返回值,没什么意义,函数返回值是匿名临时变量,函数调用完成会销毁,所以本质上没有什么作用

二.内存分配

  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.].
// 区别在这,常量区,100000fa8是内存地址,78030000是字面值888
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 = 0;
}

汇编代码如下:

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                    ........

三.C vs C++的const

关于这个问题,之前没有了解过,查找书籍没有得到比较满意的答复,这里借用这个小哥哥的博文,自己感觉写的挺好的,学习一下,后续再验证。详情点我

posted @ 2020-11-13 22:22  Jgirl  阅读(120)  评论(0)    收藏  举报