2011-12-23 57 views
4

似乎無法找到野外現有的任何東西,這似乎很奇怪。std兼容stringstream使用堆棧分配存儲?

因此,在我推出自己的產品之前,有沒有人知道在堆棧上分配存儲空間的std兼容stringstream?

我想有2種方法來實現這一目標:

最初使用一個靜態大小的緩衝區棧上(可能是模板參數允許編譯時定製)

  1. 當空間用完恢復使用動態存儲
  2. 當空間耗盡使用alloca增加棧存儲

這將異體w短於預定大小的字符串快速輸入到字符串流中。

對於初始大小的合適選擇將意味着可以實現諸如日誌記錄之類的操作,而無需從堆中頻繁調整大小。

+0

你不能使用'_alloca',因爲它不會影響調用者的堆棧(即使用stringstream的函數)。 – 2011-12-23 20:37:27

+0

我有一個日誌對象,它當前使用一個內部的stringstream對象來存儲記錄的字符串。在構建字符串時多次調用'operator <<'可能導致多個堆分配。如果我可以使用一個使用堆棧分配存儲來存儲當前日誌行的stringstream類,這將更有效率。 – 2011-12-23 20:43:13

回答

4

您可以通過使用std::basic_stringbuf<char, char_traits<char>, pooled_allocator>獲得相同的好處,只需編寫合併分配器。

然後,只需創建附加到該緩衝區的basic_iostream

或者,創建一個從basic_streambuf派生的新類。

但是不要重寫stringstream。 iostreams庫是通過擴展來替換緩衝區對象而設計的。

+0

謝謝本。我從鉻項目中找到了這個[stack_allocator](http://src.chromium.org/viewvc/chrome/trunk/src/base/stack_container.h?view=markup),但沒有成功使用它。想想我對'std :: basic_ostream' /'std :: basic_stringbuf'等的知識目前還不夠強大。 – 2011-12-24 12:26:12