當前位置:首頁 » 編程軟體 » 編譯器堆空間

編譯器堆空間

發布時間: 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的大小,如果在棧上申請過大的空間就會出錯。

最後,棧上申請空間的速度比堆上快得多,所以如果是函數內部臨時使用的小對象,一般用棧來分配。

熱點內容
電腦開機有密碼rpc伺服器不可用 發布:2024-05-03 12:40:54 瀏覽:471
硬體的演算法 發布:2024-05-03 12:34:28 瀏覽:388
支付密碼為什麼就六位 發布:2024-05-03 12:29:17 瀏覽:920
腳本找書 發布:2024-05-03 12:02:17 瀏覽:493
境外伺服器租用怎麼辦 發布:2024-05-03 11:45:34 瀏覽:943
我的世界伺服器怎麼設置到重生點 發布:2024-05-03 11:33:04 瀏覽:752
mysqllinux安裝包下載 發布:2024-05-03 11:32:07 瀏覽:934
以太演算法的幣 發布:2024-05-03 11:30:45 瀏覽:383
編譯nfs 發布:2024-05-03 11:30:40 瀏覽:432
srs搭建直播伺服器 發布:2024-05-03 11:29:53 瀏覽:133