C语言中字符串常量要占内存,那普通的常量呢?例如整型常量

如int i;i=6; 这里我知道系统要为变量i分配4个字节,那6这个整形常量还需要单独分配内存吗?还是说6不用再单独分配内存,而只是作为一个整数存在i这个变量所占的内存中?
因为谭浩强的书上有这样一句原话“在程序中出现的常量是要存放在计算机的存储单元中的。这就必须确定分配给它多少字节,按什么方式存储。例如,程序中有整数12,在Visual C++ 6.0中会分配给它4个字节,按补码方式存储。”这书上的话不太懂,看着话的意思是就单单一个整数12,也要占4个字节,我如果写int i=12,那是不是总共要占8个字节(i占4个,12占4个?)

阅读 12k
3 个回答

这个6会作为立即数写死在生成的代码中,不再占据额外的内存

我觉得这种说法太过笼统,要说占内存也可以说占比如生成的代码中会有mov [i],12 这样的代码,程序运行过程中代码被映射到内存中,也就是占内存,至于i,如果是全局变量,那么会在程序加载到内存中时,就为i分配四个字节的内存,如果局部变量,程序运行过程中会根据编译生成的代码操作esp算是未局部变量申请内存,函数结束就释放了

整型常量也是要占用内存的,但占用的内存位置有所不同。

一般来说,基本类型(整型、字符型等)常量会在编译阶段被编译成立即数,占的是代码段的内存,
而字符串常量或基本类型的常量数组占用的是数据段内存。

当然,占代码段的内存一般不在我们常说的“占内存”范围中。

由此引出一个“常识”性的代码优化实践:

在编译器不开优化的情况下,多次出现的相同常量会占用多份内存,比如下面的代码:

const char * a = "hello, world!";
const char * b = "hello, world!";

在数据段中其实有两份 "hello, world!" ,即使使用宏定义也是一样:

#define HELLO "hello, world!"

const char * a = HELLO;
const char * b = HELLO;

更好的写法是:

const static char * HELLO = "hello, world!";

const char * a = HELLO;
const char * b = HELLO;

这样,数据段中就只有一份 "hello, world!" 了。

也就是:能用 const 的,不用 #define 。

这个理解是对的,常量5 会被存放在常量区 后面再次引用时直接从常量区中取。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进