【问题标题】:Why is std::allocator not trivially copyable?为什么 std::allocator 不能轻易复制?
【发布时间】:2021-02-05 08:03:09
【问题描述】:

根据cppreferencestd::allocator 是无状态的。除了大多数无状态类型都可以简单地复制之外,我认为它们没有要复制的状态!也许我能想到的唯一例外是无状态类型,它在复制时写入某个全局变量,从而留下副作用。我不希望std::allocator 做这样的事情。

但是,以下静态断言在 Clang 和 GCC 上均失败

static_assert(std::is_trivially_copyable_v<std::allocator<int>>);

这很烦人,因为依赖于检测可复制类型来提高其性能的代码(例如,通过用 memcpys 代替实际副本)在 std::allocator 存在的情况下无法工作。为什么会这样?

【问题讨论】:

    标签: c++ typetraits c++-standard-library allocator


    【解决方案1】:

    std::allocator 不是平凡可复制的,因为它有一个用户提供的,因此不平凡的复制构造函数。复制构造函数可能是用户提供的,以便将其指定为throw()/noexcept。这通常不会成为问题,因为分配器通常由容器类持有,这绝对非常重要。

    顺便说一句,“依赖于检测可复制的类型来提高其性能的代码”听起来像是在试图超越优化器。我向您保证,您的编译器能够识别 std::allocator 可以在没有函数调用的情况下进行按位复制,并且通常它会比您的模板文件更好地识别和利用此类优化机会。

    【讨论】:

    • 而且如果是无状态的,可以no action“复制”
    猜你喜欢
    • 2016-07-06
    • 2019-08-22
    • 2019-02-25
    • 2014-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-22
    • 1970-01-01
    相关资源
    最近更新 更多