gpt4 book ai didi

c++ - 语言标准中的 "as if"

转载 作者:IT老高 更新时间:2023-10-28 23:01:25 26 4
gpt4 key购买 nike

标准中“好像”一词的确切含义是什么?当用户可以修改行为的各个部分时,它是如何工作的。

当谈到 operator new 的 nothrow 版本时,问题在于 C++ 标准。 18.4.1.1/7 阅读(我的重点):

This nothrow version of operator new returns a pointer obtained as if acquired from the ordinary version.

我的理解是,只要行为合适,“好像”不需要特定的实现。因此,如果 operator new 是这样实现的(我知道这不是一个合规的实现,因为没有循环或使用 new_handler;但我正在缩短它以专注于我的问题):

// NOTE - not fully compliant - for illustration purposes only.
void *operator new(std::size_t s)
{
void *p = malloc(s);
if (p == 0)
throw std::bad_alloc();
return p;
}

那么这样写 nothrow 版本是合法的:

// NOTE - not fully compliant - for illustration purposes only.
void *operator new(std::size_t s, const std::nothrow_t &nt)
{
return malloc(s);
}

但是假设一个程序替换了 operator new 以使用其他分配器。 “好像”是否意味着编译器必须自动更改 nothrow 版本的行为才能使用其他分配器?开发者是否需要同时替换 plain 和 nothrow 版本?

最佳答案

从1.9“程序执行:

conforming implementations are required to emulate (only) the observable behavior of the abstract machine

并在信息脚注中:

This provision is sometimes called the “as-if” rule, because an implementation is free to disregard any requirement of this International Standard as long as the result is as if the requirement had been obeyed, as far as can be determined from the observable behavior of the program. For instance, an actual implementation need not evaluate part of an expression if it can deduce that its value is not used and that no side effects affecting the observable behavior of the program are produced.

该标准确实特别指出,“as-if”要求对 operator new() 的 nothrow 版本的替换版本具有约束力。但是,当我阅读它时,该要求将落在重写 operator new() 而不是编译器的程序员身上。这个责任的另一面是,我认为标准几乎要求库提供的 nothrow operator new() 的默认实现必须按照调用 throwing new 的方式做一些事情 在 try/catch 中,如果 std::bad_alloc 被捕获则返回 0。

“好像规则”在这里可以发挥作用的地方是,如果编译器/链接器/其他东西足够聪明,可以弄清楚何时使用默认抛出 new(),默认的非抛出 new() 可以走捷径,但如果默认抛出的 new() 被覆盖,默认的非抛出 new() 必须采取不同的行动。我确信这在技术上是可行的(即使您可能无法用标准 C++ 表达它)。如果曾经有这样的实现,我会感到惊讶。

我可能对需求的解读过多,但我认为这是可以推断的。

关于c++ - 语言标准中的 "as if",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2306587/

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