13,009
回編集
81行目: | 81行目: | ||
<br><br> | <br><br> | ||
== | == メモリアライメント == | ||
==== メモリアライメントとは ==== | |||
構造体のメモリレイアウトは、コンパイラによりパディングが挿入される場合がある。<br> | |||
これは、メモリアクセスの効率化のためである。<br> | |||
<br> | |||
以下の例では、パディングのため、実際の構造体のサイズは12[バイト]になる可能性がある。<br> | |||
ただし、<code>#pragma pack</code>ディレクティブを使用して、アラインメントを制御することができる。<br> | |||
<br> | |||
<syntaxhighlight lang="c++"> | |||
struct AlignmentExample { | |||
char c; // 1 バイト | |||
int i; // 4 バイト | |||
short s; // 2 バイト | |||
}; | |||
</syntaxhighlight> | |||
<br> | |||
==== メモリアライメントの制御 ==== | |||
以下に示す方法により、構造体のアライメントを制御することができる。<br> | 以下に示す方法により、構造体のアライメントを制御することができる。<br> | ||
<br> | <br> | ||
95行目: | 111行目: | ||
アライメントの変更が必要かどうかを検討して、可能な限り標準的なアライメントを使用することを推奨する。<br> | アライメントの変更が必要かどうかを検討して、可能な限り標準的なアライメントを使用することを推奨する。<br> | ||
<br> | <br> | ||
==== GNU C/C++の属性を使用する方法 ==== | ===== GNU C/C++の属性を使用する方法 ===== | ||
GCC / Clangで動作する。<br> | GCC / Clangで動作する。<br> | ||
<syntaxhighlight lang="c++"> | <syntaxhighlight lang="c++"> | ||
103行目: | 119行目: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
<br> | <br> | ||
==== プラグマを使用する方法 ==== | ===== プラグマを使用する方法 ===== | ||
GCC / Clangで動作する。<br> | GCC / Clangで動作する。<br> | ||
<syntaxhighlight lang="c++"> | <syntaxhighlight lang="c++"> | ||
115行目: | 131行目: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
<br> | <br> | ||
==== Clang特有の属性を使用する方法 ==== | ===== Clang特有の属性を使用する方法 ===== | ||
Clangのみ動作する。<br> | Clangのみ動作する。<br> | ||
<syntaxhighlight lang="c++"> | <syntaxhighlight lang="c++"> | ||
123行目: | 139行目: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
<br> | <br> | ||
==== C++11以降の標準属性を使用する方法 ==== | ===== C++11以降の標準属性を使用する方法 ===== | ||
GCC / Clangで動作する。<br> | GCC / Clangで動作する。<br> | ||
<syntaxhighlight lang="c++"> | <syntaxhighlight lang="c++"> |