2013-01-25 26 views
1

是否有任何已知的僅用於頭文件的類STL容器/分配器,用於將內存塊添加到另一個連續內存區域,直到填充完畢爲止?目前我使用的是std::vector<char> vec,因爲它有一些有用的界面,但它不是最佳的,我認爲我濫用了它來滿足我的需求。將大塊內存追加到連續內存區域的良好容器

予先用std::vector::reserve以固定其容量和分配所需存儲器一勞永逸以避免不必要的重新分配,然後使用每個時間std::copy(&chunk[0], &chunk[size], vec.data() + vec.size())到的存儲器中的新塊附加到矢量後面的unfilled存儲器區域(當然size() <= capacity())。每次複製後,我都相應地顯式更新矢量的大小。好的,我可以使用back_inserter。但是這不是現在的觀點(見下文)。

當然std::copy可以通過任何實現專門爲char,以便它可以在最後調用memcpy,但這不是保證。我自己調用memcpy可以將塊追加到已經由vector分配的內存中,以保證這樣的保證是醜陋的。有更好/更優雅的選擇嗎?

編輯:我沒有控制如何分配內存塊。他們得到。

+9

我會說堅持用'vector ',直到你毫無疑問證明這不如手卷'memcpy'解決方案,然後*然後*將它封裝到C++構造中。 –

+0

你看到這個:http://stackoverflow.com/questions/3482941/how-do-you-realloc-in-c – 0x90

+0

爲什麼不使用char數組? – Dariusz

回答

0

基本上「真正」將內存追加到連續內存區域的唯一方法是使用Posix函數realloc()。即使使用這些分配的區域,您也可以使用std::copy,但您只需保持有關您所在區域的最終位置的知識。

但是,realloc()不保證存儲區域將位於先前的存儲位置,而是新塊完全連續。有關更多詳細信息,請參見man頁面。

幾件事情要記住:

  • 如果通過posix_memalign()分配的內存也不能保證內存對齊將保持
  • 沒有辦法找出如果realloc()複製的數據或不。
+0

嗯,我不認爲你的答案回答我的問題。我已經說得更清楚了。我真的很想有一個內存的矢量接口。 realloc()不是真的。我可以只爲所有人調用reserve(),std :: copy效率可能不高,memcpy也很難看。我無法控制塊的分配方式。 – Martin

+0

'std :: copy'非常有效。 – Puppy

+0

@DeadMG:不保證它使用memcpy/memmove,所以不能保證它是有效的。 – Martin

0

我知道這不完全是你想要的,但std::deque通常拼接連續的內存塊。

隨着它的增長,沒有任何重新分配,但整個數據可能不是連續的。

編輯

使用帶有預分配的內存vector,你可以在年底,這將不會導致重新分配insert值,除非新值將使大小超出了容量:

vector<char> values(PRE_ALLOCATED_SIZE); 
// ... 
values.insert(values.end(), chunk, chunk+CHUNK_SIZE); 
+0

謝謝,但該區域必須是連續的:) – Martin

+1

您不能將以前分配的塊添加到現有的塊。 – Puppy

+0

@DeadMG:你在說什麼? – Martin

0

這可能不是你要找的,因爲它們是爲同質容器設計的(即所有元素都具有相同類型)。我不知道這是否適合您的用例。如果您覺得它很有用,我指的是:

get_temporary_buffer - 分配原始存儲(還有一種方法可以返回存儲)。

raw_storage_iterator - 在原始存儲上輸出迭代器。

uninitialized_copy_n - 將幾個對象構造成原始存儲(也有單個元素版本)。