struct my_struct
{
char a;
short b;
int c;
};
sizeof(my_struct)
可能會在不同的機器上有所不同(任何標準C++類型的大小可能會有所不同)。它也取決於內存對齊方式(#pragma pack(*)
等)。什麼是實現固定大小結構的最佳方式?固定大小結構
struct my_struct
{
char a;
short b;
int c;
};
sizeof(my_struct)
可能會在不同的機器上有所不同(任何標準C++類型的大小可能會有所不同)。它也取決於內存對齊方式(#pragma pack(*)
等)。什麼是實現固定大小結構的最佳方式?固定大小結構
如果你可以對你的目標平臺有點現實和知識,你可以很容易地找到一些共同點,並將其作爲你的結構的基礎。
例如,如果你的目標平臺是Windows和Linux上當前的x86硬件上運行,那麼你知道的幾件事情已經:
char
是按每標準int8_t
和uint8_t
正在C++ 11恰好8位(最C++編譯器03提供這些反正)int16_t
和uint16_t
恰好16b的其下C++ 11int32_t
和uint32_t
正在C++ 11int64_t
和uint64_t
恰好32位被下C++ 11正好64個位char
陣列Endianness將仍然是一個問題,所以你必須將多字節類型時,應對這一點。
試圖設計一個結構,將由標準保證在所有異國情調的平臺上的線上具有相同的二進制表示是不可能的。您只能使用char
秒關閉,但即使如此也不能保證,因爲您不知道知道一個字節中有多少位。
你可以嘗試使用bitfields來表示你的數據,但是你仍然不知道一個字節中有多少位,所以你不能成爲certian,最後會增加多少填充。
可移植性有一個目的:便攜式代碼比平臺特定的代碼更容易維護和擴展。追求便攜性便攜性的緣故是一個沒有專業編程的學術目標。追求便攜性爲可維護性的緣故另一方面是一個值得稱讚的目標,但它也是一個平衡的行爲。如果你想出一個可以在所有可能的平臺上運行的完全可移植的解決方案,但是你只能在其中兩個平臺上運行,並且你的代碼不可能維護,那麼有什麼意義呢?
你可以做的任何事情都不會保證一個結構在所有可能的實現上具有相同的大小。關於最近的你也許可以得到會是這樣的:
struct my_struct {
char contents[some_size];
};
這至少保證了contents
將在所有實現相同的尺寸。雖然這個實現仍然可以在contents
之後插入填充,所以你仍然可以在不同的實現上獲得不同的大小。
你可以打包你的結構以確定一個確定的大小。這裏是一個鏈接,以便攜的方式實現:Visual C++ equivalent of GCC's __attribute__ ((__packed__))
「Works 2編譯器」與「便攜」不一樣。 –
爲什麼要修復它的大小? – herohuyongtao
@herohuyongtao我想讀取和寫入文件。創建的文件將不適用於在不同機器上編譯的應用程序,因爲my_struct的大小可能不同。 – Ivars
@herohuyongtao:在進程間通信中,需要控制和了解結構的大小是非常普遍的。當通過運行不同操作系統的機器通過網絡進行通信時,這是雙重事實,並且您不想將所有內容表達爲字符串。 –