gpt4 book ai didi

c++ - 为什么 std::allocator 不可复制?

转载 作者:行者123 更新时间:2023-12-03 06:54:53 29 4
gpt4 key购买 nike

根据 cppreference , std::allocator 是无状态的。我认为大多数无状态类型都可以轻松复制,因为它们没有状态可复制!也许我能想到的唯一异常(exception)是无状态类型,它会在复制时写入某个全局变量,从而留下副作用。我不希望 std::allocator 做这样的事情。

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

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

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

最佳答案

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

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

关于c++ - 为什么 std::allocator 不可复制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64479957/

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