一直很好奇const int a是如何做到让变量a只读的呢?
const修饰属于编译层面的限制。一般不会涉及到运行层面。但是对于c/c++程序员来讲,最重要在于理解const是用来做接口设计的,正确使用const可以明确传递给调用者或维护者信息,告诉他们这个变量和函数是不能修改,否则就是违背设计的初衷。通过编译层面的防错来构建设计的约束这才是const的用处。
补充:如果你用memset去修改所谓const变量的内容,发现没有任何问题,结合上面所述就能明白const到底是做什么的。
编译的时候,编译器进行语法检查可以发现变量的使用是否出现违反const的情况。出错就会报错。在链接成DLL或者EXE后,也有可能让变量是只读的。在PE的标准中,有一个section,通常的名称是.rdata,这个节内的数据就是只读数据。在运行的时候这块内存设置成只读,不能写,就达到了const的要求
const修饰只在编译层,代码中违反const的行为被禁止。但const变量的存储跟普通存储并没用区别,是可以修改const值的。
编译器直接把变量a替换成常量了
1 const是语法保留字,是编译器或解释器处理的,代码中违反const的行为会被它们禁止(报错);2 编译器会把const修饰的变量放在系统的不可修改的存储位置吧,这个可由OS来加以限制(底层方面了解不多)。
const类型的和没有声明为const类型的编译后的结果是相同的。可以看下const char *a="111";和char *a="111";在反汇编代码中是一样的,都是如下结果:
但如下代码:const char *a="111";*a="222";
编译器会报错:error C2440: '=' : cannot convert from 'char [4]' to 'const char' This conversion requires a reinterpret_cast, a C-style cast or function-style cast
所以只是编译器编译时进行了限制。
const 修饰的变量和不带const修饰的变量主要是存储的位置不同,const是在只读区中,而不带const 是放在普通的内存中。
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
暂无简介
文章 0 评论 0
接受
发布评论
评论(7)
const修饰属于编译层面的限制。一般不会涉及到运行层面。
但是对于c/c++程序员来讲,最重要在于理解const是用来做接口设计的,
正确使用const可以明确传递给调用者或维护者信息,告诉他们这个变量和
函数是不能修改,否则就是违背设计的初衷。通过编译层面的防错来构建
设计的约束这才是const的用处。
补充:
如果你用memset去修改所谓const变量的内容,发现没有任何问题,结合上面所述就能
明白const到底是做什么的。
编译的时候,编译器进行语法检查可以发现变量的使用是否出现违反const的情况。出错就会报错。
在链接成DLL或者EXE后,也有可能让变量是只读的。在PE的标准中,有一个section,通常的名称是.rdata,这个节内的数据就是只读数据。在运行的时候这块内存设置成只读,不能写,就达到了const的要求
const修饰只在编译层,代码中违反const的行为被禁止。但const变量的存储跟普通存储并没用区别,是可以修改const值的。
编译器直接把变量a替换成常量了
1 const是语法保留字,是编译器或解释器处理的,代码中违反const的行为会被它们禁止(报错);
2 编译器会把const修饰的变量放在系统的不可修改的存储位置吧,这个可由OS来加以限制(底层方面了解不多)。
const类型的和没有声明为const类型的编译后的结果是相同的。可以看下const char *a="111";和char *a="111";在反汇编代码中是一样的,都是如下结果:
但如下代码:
const char *a="111";
*a="222";
编译器会报错:
error C2440: '=' : cannot convert from 'char [4]' to 'const char' This conversion requires a reinterpret_cast, a C-style cast or function-style cast
所以只是编译器编译时进行了限制。
const 修饰的变量和不带const修饰的变量主要是存储的位置不同,const是在只读区中,而不带const 是放在普通的内存中。