为什么std :: allocator不可复制?

问题描述

根据cppreferencestd::allocator是无状态的。除了大多数无状态类型都是微不足道的,我会复制它们,因为它们没有要复制的状态!也许我能想到的唯一例外是无状态类型,该类型在复制时会写入某个全局变量,从而产生副作用。我不希望std::allocator做这样的事情。

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

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

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

解决方法

std::allocator不可平凡复制,因为它具有用户提供的,因此也不平凡的复制构造函数。可能是用户提供了副本构造函数,以便将其指定为throw() / noexcept。通常不会有什么问题,因为分配器通常由绝对不平凡的容器类持有。

顺便说一句,“依赖于检测普通可复制类型以提高其性能的代码”听起来像是您试图超越优化器。我向您保证,您的编译器能够识别std::allocator,而无需进行函数调用就可以按位复制,并且总的来说,与模板化的东西相比,它会更好地识别和利用这样的优化机会