gpt4 book ai didi

c++ - 使用 memcpy 移动非 POD C++ 对象是否总是会调用未定义的行为?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:47:22 27 4
gpt4 key购买 nike

具体来说,我对以下情况感兴趣:

  1. 众所周知,没有外部指针指向该对象(也没有指向它的任何成员)。
  2. 该对象不包含内部自引用。
  3. 保证不调用源对象的析构函数。

在这种情况下,对象似乎应该是 memcpy 可移动的,即使它们具有用户定义的构造函数、析构函数或虚函数。但是,我想知道这是否仍被视为 UB,哪个过分热心的编译器可能会将其视为格式化我的硬盘驱动器的邀请?

编辑:请注意,我问的是破坏性移动,而不是复制

是的,我知道 is_trivially_copyable 和其他人。然而,is_trivially_copyable 只涵盖了一小部分 C++ 类,而上述情况在实践中极为常见。

最佳答案

在 C++11 之前,是的,使用 memcpy() 移动非 POD 类型会调用未定义的行为。

从 C++11 开始,定义变得更加严格,因此这不一定是正确的。以下内容适用于 C++11 或更高版本。

POD 等价于“平凡”(本质上意味着“可以静态初始化”)和“标准布局”(这意味着很多东西,包括没有虚函数,对所有非虚函数具有相同的访问控制-static 成员,没有非标准布局的成员,没有与第一个非静态成员相同类型的基类,以及一些其他属性。

它是“平凡可复制”属性,允许使用 memcpy() 复制对象,正如 Joseph Thomson 在评论中指出的那样。 “平凡”类型是平凡可复制的,但反之则不然(例如,一个类可能有一个非平凡的默认构造函数——这使得它不平凡——但仍然是平凡可复制的)。类型也可能是普通但不是标准布局(这意味着它不是 POD,因为 POD 类型同时具有普通和标准布局属性)。

可以使用 std::is_trivial<type> 测试这个简单的属性或(用于复制)std::is_trivially_copyable<type> .可以使用 std::is_standard_layout<type> 测试标准布局属性.这些在标准标题中声明 <type_traits> .

关于c++ - 使用 memcpy 移动非 POD C++ 对象是否总是会调用未定义的行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35954909/

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