2011-05-04 57 views
2

我有一個結構,我想導出到一個文件,然後mmap()該文件。一個問題是,該結構有一個字符串的成員變量,我不知道如何mmap將處理。在這種情況下,所有這些字符串都是相同的大小,8個字符。我正在使用Windows,但我使用的是我在網上找到的mmap()函數,它應該複製Linux mmap()函數。如何將結構導出到文件,然後映射文件的內存?

的結構本身被定義爲:

struct testStruct 
{ 
    string testString; 
    unsigned int testInt; 
    unsigned int tsetArr[9]; 
}; 

是否有可能爲一個對象定義的sizeof()的返回值?

將映射包含結構數據的文件是可能的嗎?

我需要使用什麼代碼才能將結構導出到文件,然後進行mmap呢?

回答

6

std::string的表示不能保證C++標準,所以這不起作用。 std::string可能(並且通常會)在堆的任何位置分配其內容,因此您將存儲指針和大小成員,而不是字符串本身。

A char具有編譯時常量大小的數組,例如tsetArr應該可以工作。

是否可以爲對象定義sizeof()的返回值?

sizeof不是一個函數,所以你不能重載它(和嚴格的,它有一個,但不是返回值因爲它從任何地方不回報;它由編譯器擴展爲常量)。

將mmapping包含struct數據的文件是可能的嗎?

可能,是的,但我建議不要這樣做;你的代碼將不可移植,甚至可能無法在同一平臺上使用不同的編譯器,並且你的代碼也是如此。如果你想這樣做,只有mmap POD(普通的舊數據)沒有指針成員,並在你的struct中加入一個unsigned version成員,每次定義發生改變時都會增加。

+0

謝謝。如果所有字符串都具有相同數量的字符(8),那麼是否有可能在內存中映射一個字符串向量? – Tristan 2011-05-04 20:18:10

+0

@Tristan:'std :: vector'和'std :: string'有相同的問題:它在堆上分配它的內容(並且如果增長需要可能會改變它的位置)。一個二維數組('char [N] [8]'爲一些編譯時常量'N')應該工作。 – 2011-05-04 21:05:37

+0

再次感謝。在我將mmap的8個字符串文件讀入到二維數組之後,將這些N個項中的每一個作爲一個字符串訪問的最快方法是什麼?我將處理數十萬種物品,所以速度很重要。 – Tristan 2011-05-04 21:28:19

1
struct testStruct 
{ 
    char testString[9]; 
    unsigned int testInt; 
    unsigned int tsetArr[9]; 
};