オフセットに関して:
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