相关疑难解决方法(0)

检查C++中的double(或float)是否为NaN

是否有isnan()函数?

PS.:我在MinGW(如果这有所不同).

我不得不用isnan()从此解决了<math.h>,这是不存在的<cmath>,这让我#include在第一荷兰国际集团.

c++ double nan

358
推荐指数
12
解决办法
35万
查看次数

使用 -O3 优化依赖此 C++ 函数调用的求值顺序是否安全?

我遇到了一些 C++20 代码的问题,这些代码在发行版(-O3、clang 15)中编译时崩溃,并且由于在最终可执行文件上应用了许多混淆技术,因此调试起来非常棘手。很难看到实际执行的 x86_64 ASM。

尽管如此,我还是设法将崩溃范围缩小到以下伪代码......

for (std::wstring& data : datas)
{
    auto id = std::format(L"foo_{0}", data);

    do_something(id, std::move(data));
}
Run Code Online (Sandbox Code Playgroud)

...其中的签名do_something如下所示:

void do_something(const std::wstring&, std::wstring);
Run Code Online (Sandbox Code Playgroud)

std::wstring基本上,我认为在设置调用时应该已经调用第二个参数的移动构造函数。

现在,这段代码在 -O2 下工作得很好,但是当启用 -O3 时它就崩溃了,我有一种预感。

通读C++标准,我们可以看到以下内容......

任何表达式的任何部分的求值顺序(包括函数参数的求值顺序)均未指定(下面列出了一些例外情况)。编译器可以按任意顺序计算操作数和其他子表达式,并且在再次计算同一表达式时可以选择其他顺序。

我还读到,当 C++ 编译器没有副作用时,它们可以自由地优化局部变量(但尚未在标准中找到此特定规则)。

难道是因为std::format上面的代码本身没有副作用,所以编译器在使用 -O3 时将其“内联”到函数调用中?当它发生时,评估的顺序是未定义的,因此移动实际上发生在调用 to之前std::format

基本上我要问的是:C++ 标准允许我描述的优化吗?

c++ optimization standards

1
推荐指数
1
解决办法
104
查看次数

标签 统计

c++ ×2

double ×1

nan ×1

optimization ×1

standards ×1