Tho*_*day 7 c++ cpu-architecture pointer-arithmetic hardware-traps
在2005年11月1日的C++专栏中,Herb Sutter写道......
int A[17];
int* endA = A + 17;
for( int* ptr = A; ptr < endA; ptr += 5 )
{
// ...
}
Run Code Online (Sandbox Code Playgroud)
[O]在某些CPU架构(包括当前的架构)中,上述代码可能导致硬件陷阱发生在创建三个结束指针的位置,无论该指针是否被解除引用.
如何在bitpattern上捕获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);
Run Code Online (Sandbox Code Playgroud)
额外问题:"一些当前的CPU体系结构"这个短语是否应该被理解为仅仅指代运输产品,或者它是否包含虚构的体系结构,如果它们被描述或暗示的虚构作品具有最近的出版日期?
指针操作依赖于实现.
可能发生在某些平台上仅允许特定寄存器存储指针值(仅特定寄存器可用作索引寄存器),并且立即检查由非特权程序代码写入此寄存器的值是否为有效地址.在这种情况下,如果指针值对应于程序的地址空间中不存在的地址,则肯定会发生硬件陷阱.
如果是这种情况,编译器未优化的任何代码都会为指针分配新值,这可能会导致陷阱.
| 归档时间: |
|
| 查看次数: |
464 次 |
| 最近记录: |