关于const和define的内存分配问题的总结

关于const和define的内存分配问题

const与#define宏定义的区别----C语言深度剖析

1,  const定义的只读变量在程序运行过程中只有一份拷贝(因为它是全局的只读变量,存放在静态区),而#define定义的宏常量在内存中有若干个拷贝。

2,  #define宏是在预编译阶段进行替换,而const修饰的只读变量是在编译的时候确定其值。

3,  #define宏没有类型,而const修饰的只读变量具有特定的类型。

总结:const节省了空间,避免了不必要的内存分配,同时提高了效率。编译器通常不为普通的const只读变量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的值,没有了存储与读内存的操作,使得它的效率也很高。C++中是不太推荐用宏的,尽量少用.因为C++是强类型的语言,希望通过类型检查来降低程序中的很多错误,而宏只是在编译期前做简单替换,绕过了类型检查,失去了强类型系统的优势支撑。

例如:

#define M 3   //宏常量

const int N=5;  // 此时并未将N放入内存中

..............

int i=N;  //此时为N分配内存,以后不再分配!

int I=M;  //预编译期间进行宏替换,分配内存

int j=N;  //没有内存分配

int J=M;  //再进行宏替换,又一次分配内存!

原因:const定义的只读变量从汇编的角度来看,只是给出了对应的内存地址,而不是像#define一样给出的是立即数,所以const定义的只读变量在程序运行过程中只有一份拷贝。

在c++我们知道一般是采用const来进行替代#define的。

例如:

const int N=3;//注意采用的是赋值的形式并且末尾有分号

#define N 3

特殊情况

在C中我们知道#define进行预定义的某个数是被分配内存的,其文件在编译预处理过程中就会用定义好的数据去替代文中的符号。

但是const却是不一样的,一般情况下编译器也是不为const创建空间的,只是将这个定义的数字保存在符号表中的。但是在下列几种情况下编译器会为const定义的常量分配内存的。

  1. 1.       使用了extern

extern const int N=3;

因为使用了extern我们将可能在外部文件使用N,而const默认的是内部链接,所以我们必须要为之分配内存的。

  1. 2.       取地址操作

#include<iostream>

using namespace std;

const int M=3;

int main()

{

const       int *p=&M;

//当编译器发现有对const定义的常量进行取地址操作时候会对M进行内存分配,

//注意这个地址是const int*类型的,地址中的内容不可以改变的

int *pp=(int*)(&M)

//此处我们将const int*类型强制转化成int * 但是对于*pp的任何赋值操作还是会报错的,

//因为本质上的M是常量不可改变的,这也是const的优点

cout<<*p<<endl;

return 0;

}

  1. 3.       const定义的常量未知的时候,这是#define无法实现的。

#include<iostream>

using namespace std;

int main()

{

const int b=cin.get();//此处const定义的b是未知的所以要为它分配内存,但是一旦分配就不可以改变的。

//但是如果读者此处想在利用未知的const常量来定义数组还是会报错的。

//即int array[b]是不行的,因为编译器在从上往下走的时候是要确定数组的大小的

//但是采用new操作就不会报错的int *array=new int(b);

cout<<b<<endl;

return 0;

}

时间: 2024-10-12 12:26:57

关于const和define的内存分配问题的总结的相关文章

const和#define的区别

(1) 编译器处理方式不同 define宏是在预处理阶段展开. const常量是编译运行阶段使用. (2) 类型和安全检查不同 define宏没有类型,不做任何类型检查,仅仅是展开. const常量有具体的类型,在编译阶段会执行类型检查. (3) 存储方式不同 define宏仅仅是展开,有多少地方使用,就展开多少次,不会分配内存. const常量会在内存中分配(可以是堆中也可以是栈中). (4) const  可以节省空间,避免不必要的内存分配. 例如: #define PI 3.14159 /

iOS—— static和const联合使用;使用static const 与 #define

static和const联合使用:   static将一个全局变量变成局部变量   const将一个局部变量变成局部常量 // 定义了一个局部常量      static const CGFloat ZMJRed = 0.4; 使用static const 与 #define: 使用static const修饰变量和宏定义的比较        相同点            都不能再被修改            一处修改,其它都改了        不同点            static con

C/C++中的const与define

const int main() { const int a; int const b; const int *c; int * const d; const int * const e ; return 0; } 含义: 第一个第二个意思一样 代表一个常整形数 第三个 c是一个指向常整形数的指针(所指向的内存数据不能被修改,但是本身可以修改) 第四个 d 常指针(指针变量不能被修改,但是它所指向内存空间可以被修改) 第五个 e一个指向常整形的常指针(指针和它所指向的内存空间,均不能被修改) 结

const 和 #define区别

(1) 编译器处理方式不同 define宏是在预处理阶段展开. const常量是编译运行阶段使用. (2) 类型和安全检查不同 define宏没有类型,不做任何类型检查,仅仅是展开. const常量有具体的类型,在编译阶段会执行类型检查. (3) 存储方式不同 define宏仅仅是展开,有多少地方使用,就展开多少次,不会分配内存. const常量会在内存中分配(可以是堆中也可以是栈中). (4)const  可以节省空间,避免不必要的内存分配. 例如:           #define PI

C语言const与define的使用

const是一个C语言的关键字,它限定一个变量不允许被改变.使用const在一定程度上可以提高程序的健壮性,另外,在观看别人代码的时候,清晰理解const所起的作用,对理解对方的程序也有一些帮助. 虽然这听起来很简单,但实际上,const的使用也是c语言中一个比较微妙的地方,微妙在何处呢?请看下面几个问题. 问题:const变量 & 常量 为什么我象下面的例子一样用一个const变量来初始化数组,ANSI C的编译器会报告一个错误呢? const int n = 5;int a[n]; 答案与分

const、define与sizeof

一.const的用途 1.定义const常量 2.可以修饰函数的形参,返回值,以及函数体.被const修饰的内容可以受到强制保护,防止被意外修改,提高程序健壮性. const 返回值 函数返回值为 const  只有用在函数返回为引用的情况. 函数返回值引用常量表示不能将函数调用表达式作为左值使用.例如前面讲的返回引用的函数 min( ). int  & min ( int  &i,  int  &j); 可以对函数调用进行赋值,因为它返回的是左值:min ( a ,  b )=4

C++编程中const和#define的区别

(1) 编译器处理方式不同 define宏是在预处理阶段展开. const常量是编译运行阶段使用.(2) 类型和安全检查不同 define宏没有类型,不做任何类型检查,仅仅是展开. const常量有具体的类型,在编译阶段会执行类型检查.(3) 存储方式不同 define宏仅仅是展开,有多少地方使用,就展开多少次,不会分配内存. const常量会在内存中分配(可以是堆中也可以是栈中).(4)const 可以节省空间,避免不必要的内存分配. 例如: 1 #define PI 3.14159 //常量

iOS const和#define常量的区别

(1) 编译器处理方式不同 define宏是在预处理阶段展开. const常量是编译运行阶段使用. (2) 类型和安全检查不同 define宏没有类型,不做任何类型检查,仅仅是展开. const常量有具体的类型,在编译阶段会执行类型检查. (3) 存储方式不同 define宏仅仅是展开,有多少地方使用,就展开多少次,不会分配内存. const常量会在内存中分配(可以是堆中也可以是栈中). (4)const  可以节省空间,避免不必要的内存分配. 例如:          #define PI 3

15分钟弄懂 const 和 #define

什么是const ? 什么是#define? 他们有什么用? 他们有什么区别? 应该怎么用? 总结 1. 什么是const ? const是C/C++中的一个关键字(修饰符), const一般用来定义一个常量, 既然叫做常量, 即以后再也不能修改其值. const定义常量 2. 什么是#define? 而define, 宏定义, 则是一条预编译指令, 编译器在编译阶段会将所有使用到宏的地方简单地进行替换. 如下图所示 : 宏定义的替换 3. 他们有什么用? const 和 define 都能定义