我們在32位機器上運行的代碼中使用以下結構。如果我們必須將這個結構轉移到64位機器上,是否需要進行任何更改?從32位機器轉移到64位機器的通用結構
struct test
{
int num;
char a;
double dd;
};
我有兩個機器上網絡和I具有存儲在上述提到的結構,從32位機64位機的兩個轉移數據因此如何使上述提到的結構中通用的結構,使得數據不會鬆動。這是我的問題。
我們在32位機器上運行的代碼中使用以下結構。如果我們必須將這個結構轉移到64位機器上,是否需要進行任何更改?從32位機器轉移到64位機器的通用結構
struct test
{
int num;
char a;
double dd;
};
我有兩個機器上網絡和I具有存儲在上述提到的結構,從32位機64位機的兩個轉移數據因此如何使上述提到的結構中通用的結構,使得數據不會鬆動。這是我的問題。
這種結構的佈局是完全依賴於平臺的,您甚至不能使用它在使用不同編譯器編譯的32位應用程序的兩個實例或同一編譯器下的不同編譯設置之間傳輸數據。
數據傳輸中這種結構的唯一安全使用是在同一個可執行文件的多個實例之間。與在相同的構建中一樣。你甚至不能保證一些以後的版本會有相同的結構。
要以二進制兼容的方式傳輸二進制數據,您需要使用某種類型的二進制流,它保持固定的二進制結構,與平臺無關。谷歌協議緩衝區就是這樣一個例子,另一個是Qt的QDataStream
。
如果只需要支持少數特定情況,那麼推出自己的數據傳輸協議也不難。 –
@JohnBollinger作爲一般規則,當圖書館存在這樣做時,「滾動自己的[x]」是一個壞主意。如果這是一個小型的個人項目,你知道*永遠不會變得更大,那麼也許。但是在大多數情況下,如果您發現以後確實需要更多功能,那麼自己寫一些可能需要更改它的風險。再加上一個寫得好的圖書館應該比自己做的更容易。 – zstewart
@zstevart:取決於現有代碼運行的環境。如果它依賴於具有解決方案的框架,顯然最好的方法是使用這些解決方案。如果沒有任何東西爲現有依賴項服務,那麼需要考慮是否引入另一個依賴關係是一個好主意。這隻能通過總體分析來回答,以查看當前程序是否嘗試實施由框架X或Y提供的許多功能,以做出正確的長期決策。 – Jubatian
通常,結構不適合用於網絡或持久性目的,因爲它在C實現(編譯器+平臺)上依賴的方式太多。
「轉移」取決於您對結構和包含的元素所做的操作。
這些項目應該在你的清單:
char
可能會改變簽名。一切都嚴重依賴於在不同平臺上使用的C實現。
這取決於你如何使用它。 Int大小可能會改變,但它不是一個問題,除非你依靠你的代碼的大小 – user996142
如果你想要相同的int大小,你可以使用'int32_t'。 – ace
這也取決於「轉移這個結構」的含義。如果您只是打算重新編譯64位環境的代碼,那麼在該結構中就沒有任何固有的東西可以阻止生成的程序正常工作。但是,如果您正在討論通過二進制I/O在32位機器和64位機器之間傳輸* data *,那麼您可能需要更改。 –