gpt4 book ai didi

c++ - 与 [[gnu::pure]] 一起使用的 Meyers 单例是否有 UB?

转载 作者:太空狗 更新时间:2023-10-29 19:56:25 25 4
gpt4 key购买 nike

以下代码是否有未定义的行为?

[[ gnu::pure ]]
static const MyClass &myClass() noexcept
{
static const MyClass s_myClass;
return s_myClass;
}

根据 gcc docs , pure 属性用于除返回值外没有任何影响的函数,并且此返回值仅取决于参数和/或全局变量。

一方面,这个函数除了它的返回值之外没有任何可观察到的效果,它总是返回相同的值。因此,优化掉对该函数的多次调用是完全安全的。这就是我认为 pure 属性的用途。

另一方面,此函数需要在第一次调用时构造MyClass 对象。这包括调用 MyClass 构造函数并将隐式 is-initialised 标志设置为 true。这可以算作返回值之外的效果(尽管从外部看不到)。


此代码适用于 gcc,但 clang 优化了 MyClass 构造部分并使 myClass()返回一个未初始化的对象。 clang 开发人员坚持认为这是因为未定义的行为。

查看此错误报告:https://bugs.llvm.org/show_bug.cgi?id=36750 (注意它说的是 gnu::const,但是使用 gnu::pure 会产生相同的结果)。

最佳答案

我认为静态局部变量的初始化有两个潜在的问题。

First :

If the initialization exits by throwing an exception, the initialization is not complete, so it will be tried again the next time control enters the declaration

这意味着对该函数的连续调用可能会有非常不同的行为 - 第一次抛出而第二次不抛出。这似乎违反了 pure 的精神和意图。 .

Second :

If control enters the declaration concurrently while the variable is being initialized, the concurrent execution shall wait for completion of the initialization.

这意味着对主体的解释必须基于函数的内在状态——需要锁定等。这似乎也违反了 pure 的精神和意图。 .

关于c++ - 与 [[gnu::pure]] 一起使用的 Meyers 单例是否有 UB?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49326293/

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