gpt4 book ai didi

c - 获取对象的地址如何影响未定义的行为?

转载 作者:行者123 更新时间:2023-12-02 18:01:49 26 4
gpt4 key购买 nike

在 cppreference.com 上的 Implicit conversions 部分,在“左值转换”小节中,注意到

[i]f the lvalue designates an object of automatic storage duration whose address was never taken and if that object was uninitialized (not declared with an initializer and no assignment to it has been performed prior to use), the behavior is undefined. [emphasis mine]

据此,我了解到对象在某个时间点的“获取地址的行为”可能会以某种方式影响稍后当该对象“使用”时未定义的行为是否发生。如果我是对的,那么这至少看起来不寻常。

我说得对吗?如果是这样,那怎么可能?如果没有,我错过了什么?

最佳答案

cppreference.com 是从 C 标准中的规则得出这一点的。 C 2018 6.3.2 2 说:

If the lvalue designates an object of automatic storage duration that could have been declared with the register storage class (never had its address taken), and that object is uninitialized (not declared with an initializer and no assignment to it has been performed prior to use), the behavior is undefined.

因此,获取地址之所以重要,根本上是因为“C 标准是这么说的”,而不是因为获取地址在计算模型中“做了某事”。

将此规则添加到 C 标准的原因是为了支持 Hewlett-Packard (HP) 为其 Itanium 处理器所需的某些行为。在该处理器中,每个特定寄存器都有一个关联位,指示该寄存器“未初始化”。因此,HP 能够让程序检测并捕获某些对象尚未初始化的情况。 (此检测不会扩展到内存;该位仅与处理器寄存器相关联。)

如果使用未初始化的对象,则行为未定义,C 标准允许陷阱发生,但也允许陷阱可能不发生。因此,它允许 HP 的捕获行为,当 HP 的软件没有检测到问题并因此没有捕获时,它允许这种行为,并且它允许其他供应商忽略这一点并提供寄存器中发生的任何值,以及其他行为可能是由编译器的优化引起的。

至于根据自动存储持续时间来预测未定义的行为而不获取地址,我怀疑这有点困惑。它提供了一个适用于相关各方的标准:HP 能够设计他们的编译器以在其寄存器中使用“统一”功能,但该规则并未将大量对象使用规定为未定义行为。例如,有人可能想要编写一个算法来处理许多数组的大部分,而忽略了定义区域“沿边缘”的一些值可能未初始化。这个想法是,在某些情况下,执行一组操作,然后最后删除您不关心的操作会更有效。因此,对于这些情况,程序员希望代码能够处理“不确定值”——代码将执行,将到达操作的末尾,并且在关心的结果中将具有有效值,并且不会有任何由他们不关心的值引起的陷阱或其他未定义的行为。因此,将未初始化对象的未定义行为限制为地址未被获取的自动对象可能提供了一个对所有相关方都有效的边界。

关于c - 获取对象的地址如何影响未定义的行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74211183/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com