指针算术只是针对指向同一数组(或数组后面的元素)的元素的指针定义的行为。
是否有任何定义的行为来获取不在同一数组中的两个元素之间的内存距离?
例如,假设我有一个函数,可以在内存中跳转来访问值来计算某些内容(不在同一数组或对象中的值)。我想知道跳跃有多大(并以字节为单位打印出来),以确定是否可能发生缓存未命中及其严重程度。这可能吗?
如果我的理解是正确的,指针包含绝对虚拟地址(对于给定进程来说是绝对的),那么在一个进程中,直觉上似乎认为这应该是可能的。
是否有任何定义的行为来获取不在同一数组中的两个元素之间的内存距离?
不,通常这不存在,因为内存甚至不需要有一个平面布局,这才有意义。
但是,在大多数实现中你可以这样做
auto distance = reinterpret_cast<std::intptr_t>(&obj2)
- reinterpret_cast<std::intptr_t>(&obj1);
但是,强制转换使用的行为和映射是由实现定义的。
例如,假设我有一个函数,可以在内存中跳转来访问值来计算某些内容(不在同一数组或对象中的值)。
请注意,即使上述情况在实现上是可能的,那么通常仍然不允许您简单地使用从指针获得的数值来重建指向内存中某个对象的指针并访问它。
指针算术限制的全部要点是,允许编译器假设不可能从一个内存分配或变量到达另一个内存分配或变量。这对于优化指针逃逸分析是必要的。