abi*_*abi 32 c c++ arrays c++11
C++标准(和C就此而言)允许创建(而不是取消引用)指向超过数组末尾的一个元素的指针.这是否意味着永远不会在最后一个元素在内存边界结束的位置分配数组?我理解在实践中,部分/全部实现可能遵循此约定,但以下哪一项是正确的:
C的情况有什么不同吗?
更新:
似乎1是正确的答案.请参阅下面的James Kanze的答案,并且还可以看到efence
(http://linux.die.net/man/3/efence-感谢Michael Chastain指向它的指针)
Jam*_*nze 37
实现必须允许指向结尾的指针存在.它是如何做到这一点的.在许多机器上,你可以安全地将任何值放入指针,没有风险(除非你取消引用它); 在这样的系统上,超过结束指针的那个可能指向未映射的内存 - 我实际上在Windows下遇到了一个案例.
在其他机器上,只需将指向未映射内存的指针加载到寄存器中就会陷阱,从而导致程序崩溃.在这样的机器上,实现必须确保不会发生这种情况,无论是拒绝使用已分配内存的最后一个字节或字,还是确保除了解除引用之外的所有指针使用都会避免任何可能导致硬件的指令将其视为无效指针.(大多数此类系统具有单独的地址和数据寄存器,并且只有在指针加载到地址寄存器时才会陷阱.如果数据寄存器足够大,编译器可以安全地将指针加载到数据寄存器中以进行比较.这是通常是必要的,因为地址寄存器并不总是支持比较.)
你的最后一个问题:C和C++在这方面是完全相同的; C++只是从C接管了规则.
§3.9.2/ 3 [化合物类型]有一个有趣的段落:
指向void的指针类型或指向对象类型的指针称为对象指针类型.[...]对象指针类型的有效值表示内存中的字节地址(1.7)或空指针(4.10).
连同§5.7/ 5 [Additive operators]的文本:
[...]此外,如果表达式P指向数组对象的最后一个元素,则表达式(P)+1指向一个超过数组对象的最后一个元素,如果表达式Q指向一个超过最后一个元素对于数组对象,表达式(Q)-1指向数组对象的最后一个元素.
如果要求一个接一个结束的指针必须有效,那么似乎无法分配以内存中最后一个字节结尾的数组.如果允许一个接一个的指针无效,我不知道答案.
§3.7.4.2/ 4 [解除分配职能]一节规定:
使用无效指针值(包括将其传递给释放函数)的效果未定义.
因此,如果必须支持比较分配数组的一个结束指针,那么一个接一个结束的指针必须是有效的.
根据我得到的评论,我假设一个实现可以分配一个数组,而不必关心数组的一个接一个指针是否可用.不过,我想在标准中找出相关的段落.
归档时间: |
|
查看次数: |
2010 次 |
最近记录: |