5.37 構造体全体を packed として宣言する場合のパフォーマンスの低下

__packed で修飾された構造体全体の読み出しと書き込みを行うには、非境界整列アクセスが必要であるため、パフォーマンスが低下する可能性があります。

パックされた struct を最適化する場合、コンパイラは、各フィールドの境界整列を推測して、アクセス効率の向上を図ります。ただし、コンパイラが __packed struct 内の各フィールドの境界整列をいつも推測できるとは限りません。一方、 struct 内の個々のフィールドが __packed として宣言されている場合は、 struct 内の自然境界整列型メンバへの高速アクセスが保証されています。そのため、パック構造体の使用が必要な場合は、構造体自体をパックするのではなく、必ず構造体の個々のフィールドをパックして下さい。

struct の個々の非境界整列フィールドを __packed として宣言すると、 struct のどのフィールドが非境界整列型であるかをプログラマに明示できるというメリットもあります。
関連する概念
5.35 C および C++ コードでの __packed 修飾子と非境界整列型のデータアクセス
5.36 構造体に含まれる非境界整列型フィールド
5.40 パックされていない struct、__packed struct、個々の __packed フィールドを使用した struct の比較と、__packed struct と #pragma でパックされた struct の比較
関連する参考文書
10.12 __packed
10.97 #pragma pack(n)
非機密扱いPDF file icon PDF 版ARM DUI0472LJ
Copyright © 2010-2015 ARM.All rights reserved.