7

2005年11月1日のC++コラムで、ハーブサッターは次のように書いています...

int A[17];
int* endA = A + 17;
for( int* ptr = A; ptr < endA; ptr += 5 )
{
  // ...
}

[O]現在のCPUアーキテクチャを含む一部のCPUアーキテクチャでは、前述のコードにより、ポインタが逆参照されているかどうかに関係なく、最後から3番目のポインタが作成された時点でハードウェアトラップが発生する可能性があります。

CPUはビットパターンをどのようにトラップしますか?どうですか...

int A[17];

// (i) hardware will trap this ?
int *pUgly = A + 18; 

// (ii) hardware will trap this, too?
int *pEnd = A + 17;
++pEnd;  

// (iii) will this fool it?
int *precious = A + 17;
unsigned long tricksy = reinterpret_cast<unsigned long>(precious) ; 
++tricksy;
int *pHobbits = reinterpret_cast<int *>(tricksy); 

ボーナスの質問:「一部の現在のCPUアーキテクチャ」というフレーズは、通常、製品の出荷のみを指すと理解する必要がありますか、それとも、それらが説明または暗示されているフィクションの作品に最近の発行日がある場合は、架空のアーキテクチャも含まれますか?

4

2 に答える 2

5

ポインタ操作は実装依存です。

一部のプラットフォームでは、ポインター値の格納に特定のレジスターのみが許可され (特定のレジスターのみがインデックス レジスターとして機能できます)、特権のないプログラム コードによってそのようなレジスターに書き込まれた値が有効なアドレスであるかどうかがすぐにチェックされることがあります。この場合、ポインター値がプログラムのアドレス空間に存在しないアドレスに対応する場合、ハードウェア トラップが確実に発生します。

その場合、ポインターに新しい値を割り当てるコンパイラによって最適化されていないコードは、潜在的にトラップを引き起こす可能性があります。

于 2009-06-29T12:24:52.553 に答える
3

「投機的読書」をグーグルするかもしれません。アドレスが形成されるとすぐに、キャッシュアーキテクチャが対応するデータラインをキャッシュに入れるのが賢明かもしれません。通常、これは無害なはずですが、範囲を大幅に超えている場合 (次のページなど)、これは当てはまらない可能性があります。

于 2009-06-29T12:39:54.237 に答える