当前位置:首页 » 编程软件 » 编译器堆空间

编译器堆空间

发布时间: 2022-05-29 00:52:08

1. msp430编译器的堆栈在哪里设置

我用的是IAR 4.11b for MSP430,4.11里面改堆栈是在你工程的Options里面。首先在Workspace窗口右键单击你的工程,然后选择第一项"Options",或者选在上面菜单中选择Project->Options也可以进入这个选项。在Options里面第一个General Options中,有一堆选项卡,第五个选项卡(就是Library Options再向右一个)就是Stack/Heap,用来调整堆和栈的大小的。调的时候先在Override Default前面打钩。如果你用的是地址线没有扩展的MCU版本,则只有Stack Size 和Heap Size 两个选项可以选择。如果你是用的是较新的F5系列扩展地址线版本MCU,则还可以设置Data20 Heap Size.具体怎么设要根据你的应用需求。如果你需要自己申请用来存放Data20类型的数据,就需要把Data20 Heap Size设大一点。如果存放普通的数据那么只需要更改Stack Size和Heap Size。

Stack和Heap的区别有问题吗?如果不清楚的话上网络输入“堆和栈的区别”自己看吧。根据你的应用到底是堆空间要求多一些,还是栈空间要求多一些,给Stack Size和Heap Size分配不同大小的Size。

别的版本的IAR我也没用过,有什么问题在线交流吧。希望对你有帮助!

2. c语言堆和栈的区别用比喻,举例子说明

堆和栈的区别可以引用一位前辈的比喻来看出:
使用栈就象我们去饭馆里吃饭,只管点菜(发出申请)、付钱、和吃(使用),吃饱了就走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,他的好处是快捷,但是自由度小。
使用堆就象是自己动手做喜欢吃的菜肴,比较麻烦,但是比较符合自己的口味,而且自由度大。比喻很形象,说的很通俗易懂,不知道你是否有点收获。

3. 很多书上面写,堆空间中的内存如果不释放掉,就永远不可被别的变量占用,那么这个永远是指多久

C++编译器会为每个类自动生成一个默认的构造函数、析构函数、赋值函数、拷贝构造函数,这当然是在你没有为你的类声明这些函数的时候。这些默认的功能函数在为你提供方便的时候,也会给你带来麻烦。

例如:

class string {
public:
string(const char *value);
~string();

... // 没有拷贝构造函数和operator=

private:
char *data;
};

string::string(const char *value)
{
if (value) {
data = new char[strlen(value) + 1];
strcpy(data, value);
}
else {
data = new char[1];
*data = '\0';
}
}

inline string::~string() //注意:new 和delete 要采用相同的形式。

如果有string的两个对象,

string a("hello");
string b("world");

当b=a时,因为你自己没为类定义那些函数,所以C++编译器会提供默认的赋值函数,这个缺省的赋值操作符会执行从a的成员到b的成员的逐个成员的赋值操作,对指针(a.data和b.data) 来说就是逐位拷贝。这种情况下至少有两个问题。

第一,b曾指向的内存永远不会被删除,因而会永远丢失。这是产生内存泄漏的典型例子。

第二,现在a和b包含的指针指向同一个字符串,那么只要其中一个离开了它的生存空间,其析构函数就会删除掉另一个指针还指向的那块内存,重复析构的问题。

下面的语句:

string a("hello"); // 定义并构造 a

{ // 开一个新的生存空间
string b("world"); // 定义并构造 b

...

b = a; // 执行 operator=, 调用默认赋值函数
// 丢失b的内存,造成内存泄露。

} // 离开生存空间, 调用
// b的析构函数

string c = a; // c.data 的值不能确定! 调用默认的拷贝构造函数
// 但是a.data 已被删除,无法进行拷贝构造。

4. 请问VC6。0怎中么指定编译器堆空间大小

Determines the compiler's memory allocation limit for the precompiled header.

/Zmnumber

The number argument is a scaling factor with a default value of 100, which specifies a memory allocation of 50 MB. The maximum value is 2000. The following table shows how number modifies the memory allocation.

Value Memory allocation
10 5.0 MB
100 50 MB
200 100 MB
1000 500 MB
2000 1000 MB

不过这种情况应该是你的算法有问题吧?

5. QT编译器的堆空间不足是什么意思

你说的是手机RAM还有3G,手机提示安装空间不足是指你的手机闪存不够了,试着把手机里的应用能转到手机ROM内存(就是一般说的手机内存)里。试试看行不行。希望能帮到你

6. c语言中堆区和栈区是什么时候产生的

栈是由编译器生成和释放的,比如说你定义常量int i=1;或者变量int j;那么他们的内存地址就是由编译器在栈中生成。而堆只能由程序员手动生成释放,典型的就是malloc函数分配堆空间,free释放堆空间

7. 问一下VC的编译参数: /Zm 1.什么情况下需要设定 2.设定了有什么好处,不设定会怎么样

/Zm指定编译器在编译时使用的堆空间。下面的情况可能需要消耗更多的编译器堆内存:
1、包含了很多的头文件;
2、包含了过多的变量声明;
3、包含了过大的数组。

最常发生的情况是3,即程序中定义了一个很大的数组。估计一下数组的大小,参考下面列举的msdn资料,大致可以知道参数应该设为多少。

回答补充:
根据实际情况适当加大就可以,实在是内存紧张,可以采取二分法(找到一个满足要求的值和不满足要求的值,然后不断取中间值尝试),尽量接近实际要求的值即可。这个值不需要太精确,因为代码仍有可能改动,如果每次添加个数组什么的就要改动这个值就不划算了。

8. C语言中堆和栈的区别

(1)申请方式
stack:
由系统自动分配。例如,声明在函数中一个局部变量 int a; 系统自动在栈中为a开辟空间
heap:
需要程序员自己申请,并指明大小,在c中malloc函数
如m1 = (char *)malloc(10);
在C++中用new运算符
如m2 = (char *)malloc(10);
注意:m1、m2本身是在栈中的。

(2)申请后系统的响应
栈:只要栈的剩余空间大于所申请空间,系统将为程序提供内存,否则将报异常提示栈溢出。
堆: 首先应该知道操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时,会遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲 结点链表中删除,并将该结点的空间分配给程序,另外,对于大多数系统,会在这块内存空间中的首地址处记录本次分配的大小,这样,代码中的delete语句才能正确的释放本内存空间。另外,由于找到的堆结点的大小不一定正好等于申请的大小,系统会自动的将多余的那部分重新放入空闲链表中。
(3)申请大小的限制及生长方向
栈:在Windows下,栈是向低地址扩展的数据结构,是一块连续的内存的区域。这句话的意思是栈顶的地址和栈的最大容量是系统预先规定好的,在WINDOWS下,栈的大小是2M(也可能是1M,它是一个编译时就确定的常数),如果申请的空间超过栈的剩余空间时,将提示overflow。因此,能从栈获得的空间较小 。
堆:堆是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。由此可见,堆获得的空间比较灵活,也比较大。
(4)申请效率的比较:
栈由系统自动分配,速度较快。但程序员是无法控制的。
堆是由new分配的内存,一般速度比较慢,而且容易产生内存碎片,不过用起来最方便.
另外,在WINDOWS下,最好的方式是用VirtualAlloc分配内存,他不是在堆,也不是在栈是直接在进程的地址空间中保留一快内存,虽然用起来最不方便。但是速度快,也最灵活。
(5)堆和栈中的存储内容
栈:在函数调用时,第一个进栈的是主函数中后的下一条指令(函数调用语句的下一条可执行语句)的地址,然后是函数的各个参数,在大多数的C编译器中,参数是由右往左入栈的,然后是函数中的局部变量。注意静态变量是不入栈的。
当本次函数调用结束后,局部变量先出栈,然后是参数,最后栈顶指针指向最开始存的地址,也就是主函数中的下一条指令,程序由该点继续运行。
堆:一般是在堆的头部用一个字节存放堆的大小。堆中的具体内容有程序员安排。

9. 请问C++ 生成对象用栈空间和堆空间和什么区别用堆空间有什么优势吗我可懒得去new又去delete。

二者特性不同,各有适用场合。

首先,最重要的一点,对象生存期不同。

栈上的空间,是自动回收的,虽然省事,但如果你不想让它自动回收,你就不能用栈来空间来创建对象,典型例子是你在一个函数内部创建一个对象,然后想把它的地址传给函数外层用,你就不能在栈上创建这个对象,因为当函数一结束,此对象就被销毁了,外面访问它会出错。
而堆的话由于是完全手工创建手工回收,再碰到delete之前这个对象是不会被销毁的,就可以随意传递。

其次才是楼上说的大小的问题,堆上申请空间可以很大,但是栈的空间却很有限,根据操作系统不同而不同,一般只有1~4MB的大小,如果在栈上申请过大的空间就会出错。

最后,栈上申请空间的速度比堆上快得多,所以如果是函数内部临时使用的小对象,一般用栈来分配。

热点内容
android访问本机 发布:2025-07-01 10:56:06 浏览:410
服务器改id是什么 发布:2025-07-01 10:30:03 浏览:611
php微信开发教程 发布:2025-07-01 10:28:24 浏览:842
访问学者联系导师 发布:2025-07-01 10:27:44 浏览:984
服务器端的http地址 发布:2025-07-01 10:04:35 浏览:176
php好处 发布:2025-07-01 10:01:45 浏览:878
安卓车机什么屏幕好 发布:2025-07-01 09:46:15 浏览:548
编译原理re不能描述的串 发布:2025-07-01 09:34:24 浏览:75
本地电脑怎么用服务器ip 发布:2025-07-01 09:10:03 浏览:831
有趣的python代码 发布:2025-07-01 09:10:02 浏览:362