我不確定主題是否正確,但我會嘗試在下面解釋我的問題。我正在尋找的是某種「學術答案」,因爲我想我的兩個解決方案在運行時都會給出類似的結果。網絡I/O和C++的緩衝區的動態與靜態內存分配
我在Linux上有一個C++程序,它執行大量的網絡I/O操作,我想知道是否更好地將內置緩衝區放入客戶端類或動態分配它。第一個解決方案使用內置的緩存:
template <size_t buffer_size> class Buffer
{
// ...
char buffer [buffer_size];
}
class TcpClient
{
// ...
Buffer<1024> input_buffer;
Buffer<1024> output_buffer;
}
其次使用動態分配的緩衝區:
class Buffer
{
Buffer (size_t buffer_size) :
buffer (malloc (buffer_size))
{
// ...
}
// ...
char* buffer;
}
class TcpClient
{
// ...
Buffer input_buffer (1024);
Buffer output_buffer (1024);
}
現在,比較兩個方案我看到的第一需要較少的內存分配操作,那麼第二個,接下來的事情 - 感謝模板編譯器在編譯時知道類的大小。第一個解決方案應該提供更好的參考局部性(?),並且編譯器也可以將類的大小與其想要的任何對齊。我們也可以直接訪問緩衝區,因爲我們不需要執行額外的指針取消引用操作。
我開始思考第一個解決方案中的TcpClient對象如何在處理器緩存中運行。每次我們在代碼中訪問這樣的對象時,它都會被加載到處理器緩存中,並且它的緩衝區也會被複制,即使我們不需要它們。它會使緩存效率低下,因爲我們在那裏存儲了大量數據,增加了內存查找錯誤的概率,對嗎?
是不是浪費處理器的時間來複制緩衝區來緩存所有的時間? 從處理器和操作系統的角度來看,這兩種解決方案的其他效果是什麼? 將班級規模縮小或儘可能多地增加班級規模會更好嗎?
您可以在堆棧中分配緩衝區,並使用成員加入班級。順便說一句,你編寫C++,使用新的,而不是malloc! – neuro 2011-02-07 12:57:43