gpt4 book ai didi

c++11 - 未定义行为是否存在有效的 "use cases"?

转载 作者:行者123 更新时间:2023-12-02 22:50:19 25 4
gpt4 key购买 nike

我找到了一段带有UB的代码,并被告知将其保留在代码中,并有注释表明它是UB。仅使用 MSVC2012。

代码本身有一个原始数组 Foo对象,然后将该数组转换为 char*reinterpret_cast<char*>然后调用delete casted_array (像这样,不是delete[])就可以了。

像这样:

Foo* foos = new Foo[500];

char* CastedFoos = reinterpret_cast<char*>(foos);

delete CastedFoos;

根据标准 5.3.5/3,这显然是未定义的行为。

显然,这段代码的作用是避免调用析构函数作为优化。

我想知道,实际上是否有地方在代码中保留 UB 可以被认为有效

此外,就我而言,将上述内容保留在代码中并不明智,对吗?

最佳答案

这完全取决于您的观点。

举一个极端的例子:在C++03中,线程是未定义的行为。一旦您拥有多个线程,您的程序的行为就不再由 C++ 标准定义。

然而,大多数人会说线程有用

当然,根据 C++ 标准,多线程可能已经是 UB,但各个编译器并没有将其视为未定义。他们提供了额外的保证,即多线程将按您的预期工作

当抽象地谈论 C++ 时,UB 没有任何用处。怎么可能呢?您不知道会发生什么或将会发生什么。

但在特定的应用程序中,特定的代码由特定的编译器编译并在特定的操作系统上运行,你有时可能知道一段UB是(1)安全的,并且(2)最终会产生某种有益的效果。

关于c++11 - 未定义行为是否存在有效的 "use cases"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16318467/

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