2012-07-11 102 views
0

我們有不同的大小的大的C++實時程序使用緩衝液(例如char str[500])來存儲字符串。包裝紙字符串緩衝區

由於過去我們有一些內存泄漏,我們想用一個MyString類來包裝字符串,這個類會用緩衝區和大小初始化。

的問題是如何有效地和容易地在緩衝液和包裝分配一起,同時保持分配爲類的一部分的緩衝器,而不是從堆中分配(見下例)。

我以下列方式使用模板嘗試:

template <unsigned int N> 
class BufferString : public MyString 
{ 
public: 
    BufferString() : MyString(m_buf, N) { } 
    char m_buf[N]; 
}; 

,因此它可以被分配爲類成員或自動變量:

class SomeClass 
{ 
    BufferString<500> m_str; // Need the buffer to be allocated in SomeClass 
}; 

void foo() 
{ 
    BufferString<350> str;  // Need the buffer to be allocated on the stack 
} 

但是,可執行文件的大小增長大量使用這個解決方案,每個模板的實例約1kB(可能是由於編譯構造函數)。

有沒有更好的方法來做到這一點?

謝謝。


編輯:我發現類似我叫fixed_char_buf提出的解決方案的實現(由約翰裝甲,發現here)。

另一種實現和推理這種方法發現here

+7

你就不能使用'標準:: string'? – 2012-07-11 11:41:54

+5

在編寫時,不要將您的實現適應於任何內存泄漏問題。首先解決內存泄漏問題,然後充分利用動態內存分配。 – 2012-07-11 11:43:19

+0

爲什麼不能在堆上分配有什麼特殊要求?您提供的解決方案是IMO唯一能夠在堆棧上分配的解決方案。那麼你必須忍受大小的缺陷。 – Paranaix 2012-07-11 11:44:33

回答

0

,使用模板時,似乎是最合理,最精確的方式。如Torsten Robitzki所示,嘗試從可執行文件中剝離調試符號。

取決於你的編譯器,尤其是老年編譯器實時嵌入式系統,模板,可以快速臃腫的二進制文件的大小。如果是這種情況,有幾個選項可以避免使用模板:

  • 實施分配策略。如果BufferString寫入正確,那麼它擁有的內存(m_buf)可以分配到堆棧或堆上,而不會引入泄漏。如果碎片和時間(而不是內存泄漏)是避免堆的主要原因,那麼有許多分配模式需要考慮,這些模式專門用於緩解實時系統上的這些問題,例如池或靜態分配模式。
  • 如果堆必須被避免,並且模板導致太多膨脹,那麼另一種方法是手動聲明緩衝區和MyString分開。儘管我會盡可能避免它,但宏可以在可用性和可讀性之間提供適當的折衷。例如,下面的宏可以用來聲明自動變量:

    #define BUFFER_STRING(name, size) \ 
        char name##buffer[size];   \ 
        MyString name(name##buffer, size) 
    
+0

謝謝。看來我不得不決定使用宏(高效內存)和使用模板(方便),因爲沒有其他解決方案提出。我還會測試模板如何影響剝離的二進制文件。 – yoshigev 2012-07-12 09:05:34

0

地帶從你的可執行文件的調試符號。每個實例1k可能不是c'tor的代碼,而是調試符號。