您现在的位置是:首页 >技术杂谈 >C语言与C++中const的异同网站首页技术杂谈
C语言与C++中const的异同
简介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就变为外部链接属性
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。