假設我正在構建一個字節數組來通過TCP/IP發送數據。該字節數組包含一個字符串(空終止的字符數組)和一個附加到結尾的整數。在單個字節數組中對齊混合字符串和整數數據的方法是什麼?
所以讓我們來做這個。
char buffer[24]; // buffer that will be sent over TCP/IP
char hello[7] = "hello"
int x = 12; // int is 4 bytes
所以現在讓我們來說說我執行一個memcpy。
memcpy(buffer, hello, 7); // 7 force null character to be copied
memcpy(buffer+7, &x, 4);
通過這樣做,我相信我正在寫一個整數到一個非字對齊的地址。我認爲打包這些數據時性能會受到影響?
現在讓我們想象一下,我發送這些數據然後在另一臺計算機上接收它。當我繼續解包數據時,我需要執行正確的轉換。但是,我仍然試圖讀取一個不是字對齊的整數。這將再次成爲一次表現。我可以想象,如果我有一組整數都沒有對齊的數組,那麼這個性能會增加。
所以我的問題:當通過TCP/IP發送數據以避免性能命中時,將字對齊所有整數/浮點數是否很常見?在上面的例子中,最好是將字符串的長度擴展到8,這樣下一個可用的字節是字對齊的? memcpy是否提供了自動補償字對齊的更多方法?
投射與對齊要求不匹配的指針不僅僅是性能問題 - 它具有未定義的行爲 - 即使在您認爲處理器支持未對齊數據訪問的平臺上也是如此。 'memcpy'是正確的事情;編譯器可以在安全的情況下優化'memcpy'。 –
你的問題不清楚。你必須遵守使用的協議。但是你的方法是特定於實現並且是一個糟糕的方法正確序列化整數。如果你真的不明白他們的意思,不要使用演員。 – Olaf
@Olaf我有點困惑。發送者和接收者都知道正確的偏移和數據類型。接收器將收到一個字節數組,然後必須按照約定的消息格式進行解碼。 – Izzo