为什么 std::vector 需要 is_trivial 进行按位移动,而不仅仅是 is_trivially_copyable?
Why does std::vector require is_trivial for bitwise move, rather than just is_trivially_copyable?
我在 libstdc++ 中看到这段代码 stl_uninitialized.h:
// This class may be specialized for specific types.
// Also known as is_trivially_relocatable.
template<typename _Tp, typename = void>
struct __is_bitwise_relocatable
: is_trivial<_Tp> { };
template <typename _Tp, typename _Up>
inline __enable_if_t<std::__is_bitwise_relocatable<_Tp>::value, _Tp*>
__relocate_a_1(_Tp* __first, _Tp* __last,
_Tp* __result, allocator<_Up>&) noexcept
{
ptrdiff_t __count = __last - __first;
if (__count > 0)
__builtin_memmove(__result, __first, __count * sizeof(_Tp));
return __result + __count;
}
但在我看来,memmove 适用于可平凡复制的对象,即使它们不是平凡默认可构造的。在这种情况下谁关心默认构造函数?
我在 bugzilla 线程上询问了它,他们将我指向 。本质上,memcpy 不足以启动对象的生命周期,除非默认构造函数也是微不足道的。因此,就内存中的位而言,它在技术上是可以的,但根据标准,这将是未定义的行为。由于这个库代码是由编译器团队编写的,如果他们认为它是安全的,他们无论如何都有权这样做,但他们显然不相信安全性。
我在 libstdc++ 中看到这段代码 stl_uninitialized.h:
// This class may be specialized for specific types.
// Also known as is_trivially_relocatable.
template<typename _Tp, typename = void>
struct __is_bitwise_relocatable
: is_trivial<_Tp> { };
template <typename _Tp, typename _Up>
inline __enable_if_t<std::__is_bitwise_relocatable<_Tp>::value, _Tp*>
__relocate_a_1(_Tp* __first, _Tp* __last,
_Tp* __result, allocator<_Up>&) noexcept
{
ptrdiff_t __count = __last - __first;
if (__count > 0)
__builtin_memmove(__result, __first, __count * sizeof(_Tp));
return __result + __count;
}
但在我看来,memmove 适用于可平凡复制的对象,即使它们不是平凡默认可构造的。在这种情况下谁关心默认构造函数?
我在 bugzilla 线程上询问了它,他们将我指向