ホームページ >よくある問題 >バイトアライメントはメモリアクセスの効率に影響しますか?

バイトアライメントはメモリアクセスの効率に影響しますか?

(*-*)浩
(*-*)浩オリジナル
2019-12-26 09:27:175751ブラウズ

C プロジェクトは数が少なく、比較的小規模であるため、バイト アライメントの問題には注目していませんでしたが、大規模なアプリケーションではバイト アライメントはメモリ管理と CPU の実行効率に大きな影響を与えるはずです。この記事はいくつかの情報に基づいて短くまとめたものです。

バイトアライメントはメモリアクセスの効率に影響しますか?

#まず、最初の結論を捨てて、バイトアライメントを行うことで CPU の実行効率を向上させることができます。 (推奨学習: PHPSTORM )

メモリからデータを取得するための CPU 実行命令。ブロックのサイズは 2 バイト、4 バイト、8 バイトなどです。 -バイト、16バイト....

このとき、4バイト以上のデータを読み出すCPUの先頭アドレスが1の場合、少なくとも2つのデータブロックを読み込む必要があります。ブロック内の不要なデータが破棄され、有用なデータが 4 バイトのデータに結合されるため、明らかに CPU の動作が向上し、CPU 命令の実行効率に影響します。 CPU によって読み取られるデータの開始アドレスが 0、4... の場合、一度に読み取る必要があるデータ ブロックは 1 つだけであり、CPU の読み取り命令はアトミック操作です。

バイト アライメントとは、CPU によって読み取られるすべてのデータについて、その開始アドレスがデータ ブロックの先頭にあることを確認し、データ バイト数がデータ バイト数よりも小さい値を拡張することを意味します。 CPU データ ブロック (粒度) 。1 粒度の完全なメモリ空間を占有します。バイト アライメントにより、CPU がデータの傍受やスプライシングの操作から解放されます。

もう 1 つの結論は、バイト アラインメントがメモリの最適化に役立つということです。

この構造体では、バイト自動アライメント原則に従って、構造体

typedef struct _test {
char a;
int b;
char c;
} test;

コンパイラは、バイト数が最も大きい基本型 int のバイト数を使用します。アライメント規格によれば、char型は4バイトに拡張されるため、sizeof(test)=12となりますが、メモリ利用効率は比較的低くなります。

コンパイラで1バイトアライメントを指定すると、CPUの実行効率が低下します。

#praama pack(1)
typedef struct _test {
char a;
int b;
char c;
} test;
#pragma pack()

CPU の実行効率を確保しながらプログラムのメモリを最適化するには、構造体内のデータ メンバーの順序を調整する必要があります。

typedef struct _test {
int b;
char a;
char c;
} test;

このとき、構造体メンバー b は 4 バイトを占有し、a と c は次の 4 バイトを共有し、メンバーのうちの 2 つが最初の 2 バイトを占有し、最後の 2 バイトはバイト アライメント中に埋められた無効なデータです。この構造体は 8 を占有します。メモリ空間のバイト数。

以上がバイトアライメントはメモリアクセスの効率に影響しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。