您现在的位置是:首页 >技术杂谈 >C语言与C++中const的异同网站首页技术杂谈

C语言与C++中const的异同

不二周! 2025-03-31 12:01:03
简介C语言与C++中const的异同

一、C++编译器优化是产生差异的根源

1、C++中编译器会在编译阶段进行数据优化,会对const修饰的数据进行优化。会将对应变量直接修改为数字,那样就不会为他们单独开辟空间了,提高了效率——这叫做常量折叠

 const int bb = 20;
 int *p = (int*)&bb;  //进行了取址操作,所以会给bb开辟空间
 *p = 200;
  cout << "bb=" << bb << endl;

这里打印出来的bb为20,没有被修改,因为编译阶段直接变成了cout << "bb=" << 20 << endl;

cout << "*p=" << *p << endl;

这里打印出来的是200

2、如果不想编译器进行优化,前面加上//volatile const int bb = 20;(禁止优化volatile)

3、C++编译器不能优化的情况(此时会给他们开辟内存空间)

​    3.1.不能优化自定义数据类型

​    3.2.如果使用变量给const修饰的局部变量赋值,那么编译器就不能优化

4、什么时候C++编译器会为const修饰的全局变量开辟空间

    4.1、上述不能优化的情况

    4.2、对其进行了取地址操作

二、修饰的变量有无空间

1.C语言的const修饰的变量都有空间

2、C++语言的const修饰的变量有时有空间(对变量进行取址操作),有时没有空间(发生常量折叠,且没有对变量进行取址操作)

三、内or外部链接属性

1、C语言的const修饰的全局变量具有外部链接属性

2、C++语言中const修饰的全局变量默认具有内部链接属性(const修饰的局部变量作用域就在函数内,所以只谈论const修饰的全局变量)

extern const int c = 300;//加上extern就变为外部链接属性


 

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。