2014-01-13 117 views
2
struct my_struct 
{ 
    char a; 
    short b; 
    int c; 
}; 

sizeof(my_struct)可能會在不同的機器上有所不同(任何標準C++類型的大小可能會有所不同)。它也取決於內存對齊方式(#pragma pack(*)等)。什麼是實現固定大小結構的最佳方式?固定大小結構

+0

爲什麼要修復它的大小? – herohuyongtao

+0

@herohuyongtao我想讀取和寫入文件。創建的文件將不適用於在不同機器上編譯的應用程序,因爲my_struct的大小可能不同。 – Ivars

+1

@herohuyongtao:在進程間通信中,需要控制和了解結構的大小是非常普遍的。當通過運行不同操作系統的機器通過網絡進行通信時,這是雙重事實,並且您不想將所有內容表達爲字符串。 –

回答

2

如果你可以對你的目標平臺有點現實和知識,你可以很容易地找到一些共同點,並將其作爲你的結構的基礎。

例如,如果你的目標平臺是Windows和Linux上當前的x86硬件上運行,那麼你知道的幾件事情已經:

  • char是按每標準
  • 1個字節正好爲1個字節爲8位
  • int8_tuint8_t正在C++ 11恰好8位(最C++編譯器03提供這些反正)
  • int16_tuint16_t恰好16b的其下C++ 11
  • int32_tuint32_t正在C++ 11
  • int64_tuint64_t恰好32位被下C++ 11正好64個位
  • C風格ASCII字符串是空值終止char陣列
  • 預處理指令可採取控制包裝

Endianness將仍然是一個問題,所以你必須將多字節類型時,應對這一點。

試圖設計一個結構,將由標準保證在所有異國情調的平臺上的線上具有相同的二進制表示是不可能的。您只能使用char秒關閉,但即使如此也不能保證,因爲您不知道知道一個字節中有多少位。

你可以嘗試使用bitfields來表示你的數據,但是你仍然不知道一個字節中有多少位,所以你不能成爲certian,最後會增加多少填充。

可移植性有一個目的:便攜式代碼比平臺特定的代碼更容易維護和擴展。追求便攜性便攜性的緣故是一個沒有專業編程的學術目標。追求便攜性爲可維護性的緣故另一方面是一個值得稱讚的目標,但它也是一個平衡的行爲。如果你想出一個可以在所有可能的平臺上運行的完全可移植的解決方案,但是你只能在其中兩個平臺上運行,並且你的代碼不可能維護,那麼有什麼意義呢?

+0

謝謝!我有一些結構需要寫入文件並讀取。如果我希望我的項目能夠在多個平臺間移植,這是否意味着我必須爲每個平臺實現結構? – Ivars

+0

@ user2543574:不可以。您將只實現僅使用每個平臺已知字段的*一個*結構。然而,您必須爲每個平臺實施端轉換。 –

+0

有點偏離主題.. __int *和int * _t之間有什麼區別? – Ivars

2

你可以做的任何事情都不會保證一個結構在所有可能的實現上具有相同的大小。關於最近的你也許可以得到會是這樣的:

struct my_struct { 
    char contents[some_size]; 
}; 

這至少保證了contents將在所有實現相同的尺寸。雖然這個實現仍然可以在contents之後插入填充,所以你仍然可以在不同的實現上獲得不同的大小。

+0

但是如何讀取或寫入結構到文件?它必須以某種方式固定大小。位圖頭結構必須是固定的大小,因爲它的頭大小已被記錄。 – Ivars

+0

您寫入文件的內容不需要與內存中的內容相匹配。如果你真的關心可移植性,你通常只將單個字段寫到文件中,從而消除了大多數可能的填充(但即使這樣也不能保證可移植性)。 –

+0

所以使用類似'DummyWrite(FileHandle,&my_struct,sizeof(my_struct))'會是錯誤的?如果我有數千個領域呢?我是否必須手動編寫所有這些文件?那太糟了! – Ivars