7

Herb Sutter 在 2005年11 月 1 日的 C++ 专栏中写道...

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

[O] 在某些 CPU 架构中,包括当前的架构,上述代码可能会导致在创建结束后三指针的位置发生硬件陷阱,无论该指针是否被取消引用。

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 回答