By SmartPtr(http://www.cppblog.com/SmartPtr/) 今天收到学弟的一封信,问我关于变量与内存的一些问题,其实这是一个很基本的概念,但可能还有很多人对这个还不太了解(包括自己可能也会有误解的地方),遂将原信与回信放于此:
原信
问几个我比较混乱的问题。
看一下我写的对不对
int g_variable; //占编译后的代码空间,运行时占内存(常住内存)
const int c_value = 5; //占编译后的代码空间, 是不是常住内存呢?
void fun(void)
{
static int s_variable; //占编译后的代码空间,运行时占内存(常住内存)
int variable; //fun 被调用时放入栈中(占用内存)
}
如果我定义一下大一点的数组,如:
const int c_array[100] = ...;
程序一运行时就会被分配 400 Byte 的内存空间吗?还是在我使用它时会被分配400 Byte 的内存空间吗?
回信
先给你大概讲一下基本概念, 问题在原信下用
红色回答
一个程序的运行起来后,其在内存中有5个区域
1. 程序代码区这个很简单,存放执行指令,代码要执行,肯定要加载进内存, 我们不必关心。
2. 文字常量区一般我们这样定义一个字符串时,其是在文字常量区的:
char* s1 = "hello, world";
char* s2 = "hello, world";
if(s1 == s2)
printf("s1和s2指向同一个在文字常量区的字符串");
这里, s1和s2指向的是同一个字符串
3. 静态存储区全局变量,静态变量会放在这个区域,事实上,全局变量也是静态的。
以上1,2,3三个区域的内存在程序起来的时候就开辟好了的。
4. 栈局部变量就是在栈里的。另外,函数调用时的参数也是在栈里的,这个现在不必关心
5. 堆malloc或new出来的内存就是在堆里的,需要程序员自己管理清除。
**********原信***************************************************
问几个我比较混乱的问题。
看一下我写的对不对
int g_variable; //占编译后的代码空间,运行时占内存(常住内存)
[Huang]属于3,程序一运行就占内存,知道程序退出才释放 const int c_value = 5; //占编译后的代码空间, 是不是常住内存呢?
[Huang]其实这个与是否const无关,如果这句是全局的,那么同上,如果是局部的,那么属于4 void fun(void)
{
static int s_variable; //占编译后的代码空间,运行时占内存(常住内存)
int variable; //fun 被调用时放入栈中(占用内存)
}
[Huang]第一句属于3, 第二句属于4 如果我定义一下大一点的数组,如:
const int c_array[100] = ...;
程序一运行时就会被分配 400 Byte 的内存空间吗?还是在我使用它时会被分配400 Byte 的内存空间吗?
[Huang]还是那句话,是全局的,那么 程序一运行时就会被分配 400 Byte 的内存空间, 如果是局部的,那么在我使用它时会才会被分配400 Byte 的内存空间 你这里多次提到const, 其实const与这个主题并没有关系。的确,const与static声明的全局变量具有内部链接的特性,但是即使在每个obj里都有一个此变量的拷贝,也不影响其内存在静态区的分配。
posted on 2007-09-13 00:01
SmartPtr 阅读(1112)
评论(5) 编辑 收藏 引用