2010-09-21 82 views
2

標題有點混亂,所以我會用一些例子來解釋一下。只是一個說明:我解析文件格式。假設我們有這樣的結構:好方法來存儲各種各樣的大小也不同的結構?

struct example 
{ 
    typeA a; 
    typeB b; 
    typeX x; 
    typeY y; 
    typeZ z; 
}; 

到目前爲止它確定。現在的問題是,typeXtypeYtypeZ可能會有所不同。根據文件頭中的標誌(元數據),它們可以是兩個或四個字節大。另一件事是,有幾個這樣的結構(約40)。他們每個人使用typeXtypeYtypeZ。其中一些,一些只有一兩個。最後,他們大多數是可選的,所以可能只有四個或五個結構使用,或20或30 ...

我想知道如果有人有一些想法如何存儲這樣一個不同的數據集。我想過使用模板,但不知道它是否正確。

編輯:澄清更多:內存不是一個大問題,所以我可以承受浪費一點空間。如果typeX是四個字節,那麼所有結構都是如此。 Hovewer它們沒有同步,所以typeX可以是4個字節,typeZ可以是2個。大多數結構可能會被多次使用,所以可以有50個example1結構,10個example2結構等。

+3

他們保持同步嗎?像他們都是兩個字節,或全部4個字節?或者它們各自獨立變化?你有多少價值?有沒有什麼強大的動力來節省內存?從每個結構中刪除幾個字節? – djna 2010-09-21 08:54:05

回答

2

對我來說沒有那麼多的處理分配一些空間,在概念上,我們可以做到這一點的問題:

byte *pA = new byte[the size this time]; 

而是你與這些對象的typeA做什麼。

pA->getValue() 

return?它的意圖是,它總是,比如32位數字?還是我們真的有

pA->get16bitValue() 
在某些情況下

pA->get32bitValue() 
在別人

我會尋求一種方法來首先封裝這種差異,並且非常依賴於您如何使用這些值的方式。存儲問題可能通過一些動態分配來解決。這是我看到的那種類型A的真正beahviour。

+0

好點。該值始終是一個無符號數字。它總是一個索引,可以有超過64K條目的另一個結構(因此需要2/4字節大小)。所以看起來我總是可以看看這個數字,就好像它是一個無符號的32位數字一樣。 – PeterK 2010-09-21 10:07:32

1

一個因素,你沒有上面提到的,因爲你正在解析一個文件,這個軟件是否打算與CPU無關。一些CPU是小端的,這意味着一個數據項存儲在最低有效字節的第一個字節和最高有效字節的最後。其他CPU是big-endian,字節順序是相反的。當你解析一個文件時,如果這個文件可能是用一個相反的字節順序的CPU寫的,那麼你必須考慮這個問題。這樣做的可靠方法是定義文件格式所需的字節順序,然後一次讀取一個字節的文件,並使用適當的移位運算符構造數據。

intVal = (buffer[0] << 24) | (buffer[1] << 16) | (buffer[2] << 8) | buffer[3]; 

所以你看到直接讀取文件到結構中可能不是一個好主意。

您應該將文件視爲流(它就是這樣)並定義流操作以將數據一次傳輸到您的內部內存結構中。

如果您接受此選項,則文件格式將與您的內部存儲器結構分離。然後,您可以在內部存儲數據,只要您喜歡。在你的情況下,它聽起來像是多態的理想應用。您可以爲typeX/Y/Z的每個變體聲明一個子類。或者你可以使用一個類,並讓它在其構造函數中分配可變數量的內存。這一切都取決於你的情況。關鍵是將文件格式與內部存儲器結構分離。

+0

我有一個閱讀文件的類,它爲我解決了所有與endian相關的問題。 – PeterK 2010-09-21 09:06:25

+0

我的擔心是你試圖將一個結構直接映射到文件上。只要你不這樣做,那麼我認爲你回答你的問題並不重要。由於內存不是問題,並且如果特定文件中所有* typeX *的出現次數都是相同的大小(?),我總是將其設置爲最大大小。文件中的數據可能不需要整個內存大小的事實變得無關緊要。不要讓自己比自己更難! – 2010-09-21 09:11:25

+0

好點,但我仍然很好奇,如果任何人都可以拿出一些不錯的東西,不會浪費空間。 – PeterK 2010-09-21 09:21:12

相關問題