環顧四周,我發現很多地方都解釋了獲取某個物件(類或結構)大小的方法。我讀了關于填充,關于虛函式表影響大小以及“純方法”物件的大小為 1 位元組的事實。但是,我無法找到這些是關于實作還是 C 標準的事實(至少我無法找到所有這些)。
特別是我處于以下情況:我正在處理一些在某些物件中編碼的資料。這些物件不持有指向其他資料的指標。它們不從任何其他類繼承,但它們有一些方法(非虛擬)。我必須將這些資料放在緩沖區中才能通過某個套接字發送它們。現在閱讀我上面提到的內容,我只是簡單地將我的物件復制到發送緩沖區上,注意到資料已正確“序列化”,即復制了物件的每個成員,并且方法不影響位元組結構。
我想知道我得到的只是因為編譯器的實作還是標準規定的。
uj5u.com熱心網友回復:
C 標準中沒有精確指定類的記憶體布局。甚至沒有指定標量物件(如整數)的記憶體布局。它們由語言實作決定,通常取決于底層硬體。該標準確實指定了實作特定布局必須滿足的限制。
如果一個型別可以簡單地復制,那么它可以通過將其記憶體復制到緩沖區中來“序列化”,并且可以按照您的描述將其反序列化。但是,這種簡單的序列化僅在反序列化的行程使用相同的記憶體布局時才有效。通常不能假設是這種情況,因為另一個行程可能運行在完全不同的硬體上,并且可能是用不同的(版本)編譯器編譯的。
uj5u.com熱心網友回復:
您應該使用 POD(普通舊資料)。如果一個結構沒有虛擬表、一些建構式、私有方法和許多其他東西,它就是 POD。保證 pod 資料按宣告順序放置在記憶體中。pod 資料中存在對齊。并且您應該指定正確的對齊方式(這是您的決定)。請參閱#pragma pack (push, ???)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/390120.html
上一篇:定義函式的位置
下一篇:輸入特定值時如何過濾輸入值
