2010-08-02 43 views
6

我遇到了一個奇怪的問題,我已經能夠追蹤一些,但我仍然無法看到原因。也許這裏有人可以說出一些光明?在嵌入式平臺上線程級內存分配奇怪

我正在使用PPCgnu604工具鏈在C++開發的VxWorks 5.5之上運行PowerPC處理器。

我有一個類,像這樣:

class MyClass 
{ 
    public: 
    void run(void); 
    private: 
    CommandMesssageClass command; 
    StatusMessageClass status; 
}; 

當我的應用程序啓動時,它會動態分配MyClass的實例和產卵指向它的「運行」功能的線程。本質上它只是在那裏查詢命令,一旦收到,就會返回狀態。

請注意,這是一個類的削減版本。爲簡潔起見,還有許多其他方法和變量。

我看到的問題是,當命令和狀態消息都被定義爲私有類成員時,儘管事實上不應該有動態內存分配,我仍然會在內存中的可用字節中進行更改。這很重要,因爲這是需要成爲一個確定性和速率安全程序的情況。

如果我將一個或兩個消息聲明移動到運行函數中,它可以正常工作,不需要額外的分配!

我在理解C++聲明和內存分配時必須缺少一些基本的東西。我的理解是,我動態實例化的類實例將在創建時在堆(包括所有成員變量)上完全分配。我在這裏看到的區別是將消息聲明移動到運行函數將它們放在堆棧上。在這種情況下堆是足夠大,以達到整個班級的大小。爲什麼在使用特定部分之前似乎沒有分配足夠的內存?

消息類不會自己動態分配。 (如果他們這樣做,我希望移動聲明不會改變這種情況下的行爲,我仍然會看到堆的大小發生變化。)

要監視內存分配,我使用以下VxWorks的memLib(或memPartLib)調用:

memPartInfoGet(memSysPartId, &partitionStatus); 
... 
bytesFree = partitionStatus.numBytesFree; 

編輯:

爲了澄清,所述MyClass的對象被instansiated和在初始化例程初始化,然後代碼進入速率保護處理。在此期間,一旦通過串行線路接收到命令消息(與Command或Status消息對象的第一次交互),就會分配更多的內存(或者更確切地說,字節數量會自由減少)。這是不好的,因爲動態內存分配不是確定性的。

我已經能夠通過移動類變量來解決問題,正如我所描述的。

+0

這不是entierly清楚你的問題是什麼,是你使用更多的內存分配的東西,類成員VS在棧上,抑或是在使用的內存隨時間的情況下,一個變化? – nos 2010-08-02 22:46:41

+1

當您將成員提升到公共部分時,sizeof(MyClass)會發生變化嗎?內存分配有多少變化? – 2010-08-02 23:08:31

+1

* *分配改變了嗎?較小的類對象更容易適應堆中的空閒塊。 – 2010-08-03 07:19:12

回答

2

我在理解C++ 聲明和內存分配時必須缺少一些東西 。

我不這麼認爲。你所期望的所有內容都是正確的 - 遊戲程序員一直非常依賴這種行爲。:-)

爲什麼它似乎不被分配 足夠的內存,直到被用於特定部分 ?

爲了簡潔起見,您已經省略了該類的內涵。我有一些經驗調試類似的問題,而我最好的猜測是,在某處有一個庫函數,其實,使得運行時間分配,你不知道。

換句話說,運行時間分配是有兩種情況,但MyClass的兩個不同尺寸意味着malloc的池不同填補。您可以通過將對象移動到run()內的堆棧來證明這一點,但可以將MyClass填充到相同的大小。如果你仍然看到空閒的mem drop,那麼它與這些對象是堆棧還是堆棧無關......這是由於MyClass的大小而發生的第二個效果。

記住,malloc的是矮胖 - 大多數實現不爲每次調用函數malloc做一比一分配。相反,它會過度分配內存並將其保留在池中,並在必要時增加這些池。

我不熟悉你的工具鏈,但在嵌入式系統意想不到的小分配典型的犯罪嫌疑人包括ctype函數(語言環境),以及日期/時間函數(時區)。