代码之家  ›  专栏  ›  技术社区  ›  R Samuel Klatchko

语言标准中的“似”

  •  13
  • R Samuel Klatchko  · 技术社区  · 16 年前

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

    operator new . 18.4.1.1/7阅读(我的重点):

    这个nothrow版本的operator new返回一个指针 犹如

    我的理解是,“好像”不需要具体的实现,只要行为是适当的。所以如果 新操作员 是这样实现的(我知道这不是一个兼容的实现,因为没有循环或使用新的\u处理程序;但我缩短了时间来关注我的问题):

    // 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;
    }
    

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

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

    3 回复  |  直到 14 年前
        1
  •  7
  •   Michael Burr    16 年前

    从1.9“程序执行:

    一致性实现需要模拟(仅)抽象机器的可观察行为

    在信息脚注中:

    这一规定有时被称为“似乎规则”,因为只要结果是符合要求,只要可以从程序的可观察行为中确定,实施就可以自由地忽略本国际标准的任何要求。例如,一个实际的实现不需要计算表达式的一部分,如果它能够推断出它的值没有被使用,并且不会产生影响程序的可观察行为的副作用。

    operator new() . 然而,正如我所读到的,这个要求将落在程序员的头上 运算符new() 不是编译器。这种责任的另一面是,我认为标准基本上需要nothrow的默认实现 运算符new() 由图书馆提供的一些东西必须沿着调用抛出 new 在try/catch中,如果 std::bad_alloc 被抓住了。

    如果编译器/链接器/任何东西足够聪明,在默认抛出 new() 新建() 可以走捷径,但如果 新建() 被重写,默认的非抛出 新建() 必须采取不同的行动。我确信这在技术上是可以实现的(即使您可能无法用标准C++来表达它)。如果有一个实现可以做到这一点,我会感到惊讶。

        2
  •  2
  •   CB Bailey    16 年前

    operator new 在兼容C++程序的行为上有一个可观察到的差异,那么是的,它可能需要实现 不准扔 版本特别是如果 operator delete 新的必须改变。

    我的读物是 犹如 新操作员 . 一旦他完成了,就不能使用 malloc 基于 新操作员 并且必须显式地调用用户声明的版本,或者至少重用足够多的用户声明的版本,以使一致性程序无法判断这不是 不准扔 版本已实现。

        3
  •  0
  •   Dan    16 年前

    应该 更换普通版和非普通版。看看这个 article