構造の長さに関する質問 - データ損失の原因

オフセットに関して

1. 構造体変数内のメンバーのアドレス オフセットは、前のメンバーのオフセットにメンバーのサイズを加えたものです。
2. 構造体のサイズは、最後のメンバーのオフセットに最後のメンバーのサイズを加えたものと等しくなります。

ストレージ変数のアドレスアライメントについて

コンパイラーは、プログラムをコンパイルするときに次の 2 つの原則に従います。
1. 構造体変数内のメンバーのオフセットはメンバー サイズの整数倍である必要があります (0 は任意の数の整数倍とみなされます) 2. 構造体のサイズはすべてである必要があり
ますmembers サイズの整数倍。

例:
  struct ssd
  {   float a; アドレス オフセット 0 (最初のアドレス)   int b; アドレス オフセット 4 (0+4)   char c; アドレス オフセット 8 (4+4)   char d; アドレス オフセット 9(8+1)   float e ; アドレス オフセット 10(9+1)   };答え:   原則 1: 満たされていない、アドレス オフセット 10 はメンバー サイズの整数倍ではありません (4)   原則 2: 満たされていません、構造体のサイズは 14 です。すべてのメンバーのサイズ (4/1) の整数倍ではない   ため: コンパイラーは自動的に 2 つの空のバイトを e、   つまり float e に追加します; アドレス オフセット 12 (9+1+2)   原則 1: 満たされています。アドレス オフセット 12 はメンバ サイズの整数倍です (4)   原則 2: 満たされています。構造体のサイズは 16 で、すべてのメンバ サイズの整数倍です (4/1)要約: アドレス オフセットの長さを計算するときは、構造体に注意してください。構造体のメンバー間のデータ配置要件を単純に構造体のメンバーのサイズに従って計算すると、データの損失が発生します。













  

参考:https://blog.csdn.net/jueduiwudi6/article/details/80721108?utm_medium=distribute.pc_relevant.none-task-blog-2defaultbaidujs_utm_term~default-0.no_search_link&spm=1001.2101.3001.4242.1

おすすめ

転載: blog.csdn.net/weixin_49048045/article/details/120991144