不必要なパディング
説明
このチェッカーは、アライメント要件を満たすために struct オブジェクトのメンバーの配置で追加のパディングが必要になる場合、このオブジェクトにフラグを設定します。このような struct オブジェクトのメンバーを再配置することで、追加のパディングを必要とせずにアライメント要件を満たせる場合があります。アライメントのためのパディングが不要になるため、パディングを排除してメモリを節約できます。64 ビット システムの次の struct について考えます。
struct A {
uint32_t m1;// 4 bytes
uint64_t m2;// 8 bytes
uint32_t m3;// 4 bytes
};
m1 と m2 が連続して配置される場合、マシンが m2 を読み取るためには 2 サイクルが必要になります。代わりに、変数 m1 を 4 バイトでパディングしてから 8 バイトのスロットに単独で配置します。続いて m2 を単独で 8 バイトのスロットに配置します。struct A のアライメント要件を満たすために、変数 m3 もパディングされます。m1、m2、m3 のサイズを合計すると 16 バイトですが、パディングが行われているため、A のサイズは 24 バイトになります。Polyspace® は、struct のメンバーを再配置することでアライメント要件を満たせる場合に、この欠陥を報告します。たとえば、A のメンバーを再配置すれば、パディングを排除できます。
struct A {
uint64_t m2;// 8 bytes
uint32_t m1;// 4 bytes
uint32_t m3;// 4 bytes
};
m2 を 8 バイトのスロットに配置しています。次に、m1 と m3 を別の 8 バイトのスロットに一緒に配置します。この再配置により、パディングを排除できます。リスク
不必要なパディングはメモリを浪費します。この浪費によって、次のようないくつかの悪影響が生じることがあります。
必要以上のメモリを使用すると、利用可能なメモリが使い果たされて、ページングの障害につながる可能性があります。
memcpy、memcmpなどの関数の処理時間が長くなる可能性があります。
修正方法
この欠陥を修正するには、不必要なパディングを排除するために struct のメンバーを再配置します。最初に最大の struct のメンバーを宣言してから、同じサイズのメンバーの宣言を 1 つにまとめます。また、pragma 命令を使用してパディングを排除することもできます。
パフォーマンスの改善の程度は、使用しているコンパイラ、ライブラリ実装、環境によって異なる可能性があります。
例
結果情報
| グループ: パフォーマンス |
| 言語: C | C++ |
| 既定値: オフ |
コマンド ライン構文: UNNECESSARY_STRUCT_PADDING |
| 影響度: Medium |
バージョン履歴
R2021b で導入