首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

stack and heap que,该如何处理

2012-02-16 
stack and heap que我想知道,为什么很多人喜欢问堆和栈存储的是哪些数据这个问题,大家在设计程序的时候需

stack and heap que
我想知道,为什么很多人喜欢问堆和栈存储的是哪些数据这个问题,大家在设计程序的时候需要经常考虑这个问题么?
我感觉需要用指针或数组的时候就用了啊,根本没考虑这个存储问题
请有经验的人指点迷经     谢谢!

[解决办法]
Stack的优点
1)自己不用进行内存管理(申请和释放)
2)速度比用堆要快

用到堆的情况:
1)内存不固定,需要在运行时确定
2)为了减少程序本身大小,记得以前公司为了减小编译后程序的大小,曾组织一次把大的局部变量都改为heap上分配的方式
[解决办法]
无语.. freshairfly 完全没概念。。
[解决办法]
除了灵活性外,
stack: 空间换时间;
help:时间换空间;
[解决办法]
推荐你好好看看林锐博士《高质量C++/C 编程指南》,里面有很详细的介绍(下面简单摘录几段):
7.1 内存分配方式
内存分配方式有三种:
(1) 从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的
整个运行期间都存在。例如全局变量,static 变量。
(2) 在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函
数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集
中,效率很高,但是分配的内存容量有限。
(3) 从堆上分配,亦称动态内存分配。程序在运行的时候用malloc 或new 申请任意
多少的内存,程序员自己负责在何时用free 或delete 释放内存。动态内存的生存
期由我们决定,使用非常灵活,但问题也最多。


7.3 指针与数组的对比
C++/C 程序中,指针和数组在不少地方可以相互替换着用,让人产生一种错觉,以
为两者是等价的。
数组要么在静态存储区被创建(如全局数组),要么在栈上被创建。数组名对应着(而
不是指向)一块内存,其地址与容量在生命期内保持不变,只有数组的内容可以改变。
指针可以随时指向任意类型的内存块,它的特征是“可变”,所以我们常用指针来操
作动态内存。指针远比数组灵活,但也更危险。
下面以字符串为例比较指针与数组的特性。
7.3.1 修改内容
示例7-3-1 中,字符数组a 的容量是6 个字符,其内容为hello\0。a 的内容可以改变,
如a[0]= ‘X’。指针p 指向常量字符串“world”(位于静态存储区,内容为world\0),常
量字符串的内容是不可以被修改的。从语法上看,编译器并不觉得语句p[0]= ‘X’有什么
不妥,但是该语句企图修改常量字符串的内容而导致运行错误。
char a[] = “hello”;
a[0] = ‘X’;
cout < < a < < endl;
char *p = “world”; // 注意p 指向常量字符串
p[0] = ‘X’; // 编译器不能发现该错误
cout < < p < < endl;
示例7-3-1 修改数组和指针的内容
7.3.2 内容复制与比较
不能对数组名进行直接复制与比较。示例7-3-2 中,若想把数组a 的内容复制给数
组b,不能用语句 b = a ,否则将产生编译错误。应该用标准库函数strcpy 进行复制。
同理,比较b 和a 的内容是否相同,不能用if(b==a) 来判断,应该用标准库函数strcmp
进行比较。
语句p = a 并不能把a 的内容复制指针p,而是把a 的地址赋给了p。要想复制a
的内容,可以先用库函数malloc 为p 申请一块容量为strlen(a)+1 个字符的内存,再用
strcpy 进行字符串复制。同理,语句if(p==a) 比较的不是内容而是地址,应该用库函
数strcmp 来比较。
// 数组…
char a[] = "hello ";
char b[10];
strcpy(b, a); // 不能用 b = a;
if(strcmp(b, a) == 0) // 不能用 if (b == a)

// 指针…
int len = strlen(a);
char *p = (char *)malloc(sizeof(char)*(len+1));
strcpy(p,a); // 不要用 p = a;
if(strcmp(p, a) == 0) // 不要用 if (p == a)

示例7-3-2 数组和指针的内容复制与比较
7.3.3 计算内存容量
用运算符sizeof 可以计算出数组的容量(字节数)。示例7-3-3(a)中,sizeof(a)
的值是12(注意别忘了’\0’)。指针p 指向a,但是sizeof(p)的值却是4。这是因为
sizeof(p)得到的是一个指针变量的字节数,相当于sizeof(char*),而不是p 所指的内
存容量。C++/C 语言没有办法知道指针所指的内存容量,除非在申请内存时记住它。
注意当数组作为函数的参数进行传递时,该数组自动退化为同类型的指针。示例
7-3-3(b)中,不论数组a 的容量是多少,sizeof(a)始终等于sizeof(char *)。
char a[] = "hello world ";
char *p = a;
cout < < sizeof(a) < < endl; // 12 字节
cout < < sizeof(p) < < endl; // 4 字节
示例7-3-3(a) 计算数组和指针的内存容量
void Func(char a[100])
{
cout < < sizeof(a) < < endl; // 4 字节而不是100 字节
}
示例7-3-3(b) 数组退化为指针

热点排行