gpt4 book ai didi

c++ - std::is_trivially_copyable 要求

转载 作者:搜寻专家 更新时间:2023-10-31 00:32:24 28 4
gpt4 key购买 nike

C++ 标准(以及多个 SO answers )声明符合 is_trivially_copyable<T> 的条件, 一个类型 T必须有:

  1. 一个默认的析构函数,
  2. 没有虚函数,
  3. 没有虚拟基类。

(这些不是唯一的要求,但问题只关注这些)

有人可以阐明原因吗?我看不出违反这 3 个中的任何一个是如何构成 T 的数组的对 memcpy 不安全。

最佳答案

关于 1(“默认析构函数”),仅仅是因为 memcpy将新对象转换为现有变量不会调用其覆盖的析构函数,因此如果该类依赖于该析构函数中的任何内容,则可能会违反其约束。

关于 2(“无虚函数”),可能的原因是当对象切片发生时,切片对象必须作为基类对象正确运行。

这样想象一个基类和一个派生类:

class Base {
int b;
virtual void f() { ++b; }
}

class Derived : public Base {
int d;
void f() override { ++d; }
}

现在假设你有一个 Base&变量 v实际上引用了 Derived目的。如果std::is_trivially_copyable<Base>是真的,你可以memcpy从这个变量到另一个 Base对象 w (这将复制 bvtable )。如果你现在调用 w.f() ,你会调用(通过 vtable)Derived::f() .这当然是未定义的,如w.d没有分配存储空间。

这也可能占 3(“无虚拟基类”),但由于我几乎从不使用虚拟基类,所以我会听从更熟悉它们的人。

关于c++ - std::is_trivially_copyable 要求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31424185/

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