多くのシステムでは、この状況ではsize
、4の倍数である必要があります(システムのサイズが4バイトであることを含め、以下に詳述する追加の条件が適用さint
れます)。これを必要としないシステムでは、通常、これが推奨されます。
まず、のタイプhead
はvoid *
であり、C標準では、。を使用してポインタ演算を実行したときに何が起こるかを定義していませんvoid *
。
一部のコンパイラ、特にGCCとその継承者は、この算術演算を型がであるかのように扱いchar *
ます。これに基づいて進めます。
第二に、私はsbrk
特定の配置でアドレスを返す保証を知りません。
sbrk
それが適切に調整されたアドレスを返し、C実装が評価するための単純なことを行うと仮定します。これは、 (に変換された)の値をアドレス* (int *) (head + size) = value
に書き込むストア命令を発行することです。value
int
head + size
次に、あなたの質問は次のようになります。私のコンピューティングプラットフォームは、int
この住所の店舗で何をしますか?
プラットフォーム上でhead + size
適切に調整されたアドレスである限り、ストアは期待どおりに実行されます。int
ほとんどのプラットフォームでは、4バイト整数は4バイトアライメントを優先し、8バイト整数は8バイトアライメントを優先します。head
このプリファレンスの倍数に調整され、このプリファレンスの倍数である限りsize
、ストアは正常に実行されます。
それ以外の場合、何が起こるかはプラットフォームによって異なります。一部のプラットフォームでは、ハードウェアはストアを実行しますが、メモリへの2つの別々の書き込みに分割されるため、通常のストア命令よりも実行が遅くなる場合があります。(これは、同じメモリを共有する他のプロセスが、値の一部が保存されている間はメモリを読み取ることができるが、他の部分は保存されていない可能性があることも意味します。これも、コンピューティングプラットフォームの特性によって異なります。)
一部のプラットフォームでは、ハードウェアは、プログラムの実行を中断し、オペレーティングシステムに制御を移す例外を通知します。一部のオペレーティングシステムは、失敗した命令を分析し、目的のストアを実行する代替命令を実行することによって、ずれたストアを修正します(または、オペレーティングシステムは、この修正作業を行う、プログラム内の特別なコード(場合によっては自動的に含まれるライブラリ内)に例外を中継します) 。これらのプラットフォームでは、位置がずれているストアは非常に遅くなります。プログラムのパフォーマンスを大幅に低下させる可能性があります。
一部のプラットフォームでは、ハードウェアが例外を通知し、オペレーティングシステムが不整合なストアを修正しません。代わりに、オペレーティングシステムはプロセスを終了するか、問題に関するシグナルを送信します。これにより、多くの場合、プロセスが終了します。(他の可能性には、デバッガーのトリガーや、信号を処理するためにプログラムに含めた特別なコードの入力が含まれます。)