我遇到了一個奇怪的問題,我已經能夠追蹤一些,但我仍然無法看到原因。也許這裏有人可以說出一些光明?在嵌入式平臺上線程級內存分配奇怪
我正在使用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消息對象的第一次交互),就會分配更多的內存(或者更確切地說,字節數量會自由減少)。這是不好的,因爲動態內存分配不是確定性的。
我已經能夠通過移動類變量來解決問題,正如我所描述的。
這不是entierly清楚你的問題是什麼,是你使用更多的內存分配的東西,類成員VS在棧上,抑或是在使用的內存隨時間的情況下,一個變化? – nos 2010-08-02 22:46:41
當您將成員提升到公共部分時,sizeof(MyClass)會發生變化嗎?內存分配有多少變化? – 2010-08-02 23:08:31
* *分配改變了嗎?較小的類對象更容易適應堆中的空閒塊。 – 2010-08-03 07:19:12