gpt4 book ai didi

类 POD 数据的 C++ 保证和名称,支持 memcpy

转载 作者:IT老高 更新时间:2023-10-28 22:14:40 26 4
gpt4 key购买 nike

在另一个 question我错误地使用术语 POD 来指代实际上不是 POD 类型的数据类型(因为有构造函数)。现在,我浏览了标准,找不到我想要的合适名称。我也找不到真正允许复制的保证。

我指的数据类型是 POD,但可能包含函数,包括构造函数,但与等效的 POD 类型相比,不会改变其对齐或大小特征。

在标准的第 3.9 节中,它声明可以使用 memcpy 将 POD 数据复制到另一个对象,或者复制到字符数据并返回。从未对非 POD 数据做出此类保证。

然而,对象的对象表示是在同一节中定义的。它的定义让人相信任何两个相同类型的对象都可以通过 memcpy 安全地复制。

所以我的问题是:

  1. 实际上是否可以保证带有 memcpy 的拷贝对于此类对象是安全的?
  2. 如果是,那为什么要特别说明 memcpy 和 POD?
  3. 这种类型的数据有没有 memcpy 安全的名称?

我的意思是对象类型的一个简单示例:

struct ex_struct
{
int a,b,c,d;
ex_struct() : a(123) { }
}

阅读 C++0x 草案,我的结构似乎是一个可简单复制的类 (9.1)。我相信这意味着 memcpy 是安全的。

最佳答案

在 C++0x 中,PODness 的概念被分解为几个单独有用的类别:

A trivially copyable class is a class that (draft 3242, section [class]):

  • has no non-trivial copy constructors (12.8),
  • has no non-trivial move constructors (12.8),
  • has no non-trivial copy assignment operators (13.5.3, 12.8),
  • has no non-trivial move assignment operators (13.5.3, 12.8), and
  • has a trivial destructor (12.4).

A trivial class is a class that has a trivial default constructor (12.1) and is trivially copyable.

[ Note: In particular, a trivially copyable or trivial class does not have virtual functions or virtual base classes. — end note ]

A standard-layout class is a class that:

  • has no non-static data members of type non-standard-layout class (or array of such types) or reference,
  • has no virtual functions (10.3) and no virtual base classes (10.1),
  • has the same access control (Clause 11) for all non-static data members,
  • has no non-standard-layout base classes,
  • either has no non-static data members in the most derived class and at most one base class with non-static data members, or has no base classes with non-static data members, and
  • has no base classes of the same type as the first non-static data member.

对普通构造函数、赋值运算符和析构函数的要求分散在第 12 节“特殊成员函数”[special]中。

关于类 POD 数据的 C++ 保证和名称,支持 memcpy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5430801/

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