C++处理const类型变量与C的不同
const与#define最大的差别,Const在堆栈分配了空间,而#define只是把具体数值直接传递到目标变量罢了。或者说,const的常量是一个Run-Time的概念,他在程序中确确实实的存在可以被调用、传递。而#define常量则是一个Compile-Time概念,它的生命周期止于编译期:在实际程序中他只是一个常数、一个命令中的参数,没有实际的存在。
@ const常量存在于程序的数据段。
@ #define常量存在于程序的代码段。
我们要把这个问题分不同的编译器来看。所以一般我们认为,Const常量是分配了内存空间的,而且只分配一次,在使用Const常量时与使用变量的引用方式一样,如王san所讲『使用const常量还可以避免目标码的多份复制。在程序中,仅有一个内存来存放常量』
但是根据编译器的不同,还略有不同。
◆C编译器
在C编译下,Const常量是完全分配了内存空间的,在使用时,是像变量一样来使用的。参见以下实验代码。
@@@@@@@@@@@@@@实验代码@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
3: const int a = 100;
4: main()
5: {
7: int x = a;
00401028 mov eax,[_a (0041f01c)]
0040102D mov dword ptr [ebp-4],eax
@@@@@@@@@@@@@@实验代码@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
◆C++编译器
为了提高程序的执行效率,c++的编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高,这时Const常量是和#define常量一样的。如李san实验的结果一样『从汇编代码看,两种方法的汇编代码是相同的,所以目标码多份复制好像也不成立』。
但是C++编译器对除了直接定义的Const常量外,都是分配内存的。所以,有以下来那个两种情况。
1.分配内存的情况:
extern const int bufsz; //外部声明
@@@@@@@@@@@@@@实验代码@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
7: #define TEST_DATA_DEF 100;
9: extern const int ccd;
14: int a = TEST_DATA_DEF;
00401028 mov dword ptr [ebp-4],64h
15: int b = ccd;
0040102F mov eax,[ccd (0042201c)]
00401034 mov dword ptr [ebp-8],eax
@@@@@@@@@@@@@@实验代码@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2. 不分配内存的情况:
const int bufsz = 100; //全局常量
@@@@@@@@@@@@@@实验代码@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
12: const int test = 100;
004
相关文档:
1、局部变量能否和全局变量重名?
答:能,局部会屏蔽全局。要用全局变量,需要使用"::" ;局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。对于有些编译器而言,在同一个函数内可以定义多个同名的局部变量,比如在两个循环体内都定义一个同名的局部变量,而那 ......
1.介绍一下STL,详细说明STL如何实现vector.
Answer:
STL (标准模版库,Standard Template Library.它由容器算法迭代器组成。
STL有以下的一些优点:可以方便容易地实现搜索数据或对数据排序等一系列的算法;调试程序时更加安全 和方便;即使是人们用STL在 ......
In C programming language, the observer design pattern is implemented with function pointer (aka callback function). But in Qt library, it introduces signal and slot. How to link a callback function from the C callback function to the C++ siganl and slot is a problem I encounter. Call back function ......
Java跨平台的特性使Java越来越受开发人员的欢迎,但也往往会听到不少的抱怨:用Java开发的图形用户窗口界面每次在启动的时候都会跳出一个控制台窗口,这个控制台窗口让本来非常棒的界面失色不少。怎么能够让通过Java开发的GUI程序不弹出Java的控制台窗口呢?其实现在很多流行的开发环境例如JBuilder、Eclipse都是使用纯Java ......
1.strlen()
实现:
size_t strlen(const char *s)
{
size_t n;
for(n = 0; *s != '\0'; s++)
++n;
return n;
  ......