【问题标题】:Can I memcpy objects data, which has Standard Layout compatible class in C++11? [duplicate]我可以 memcpy 对象数据,它在 C++11 中具有标准布局兼容类吗? [复制]
【发布时间】:2018-10-18 09:56:05
【问题描述】:

在 C++11 草案文档的第 3.9.2 节中:

(文档编号N3242=11-0012,日期:2011-02-28,修订:N3225,名称:工作草案,C++编程语言标准) 有人说:

对于“平凡”的任何对象(基类子对象除外) 可复制”类型 T,无论对象是否拥有有效值 类型 T,可以复制构成对象的底层字节(1.7) 放入一个 char 或 unsigned char 数组中。

我找不到任何关于我可以对具有标准布局类型的对象执行类似操作的信息。

对类型为标准布局类型的对象进行这样的操作是否合法?

实际上我想要做什么,如果 std::is_standard_layout<T>::value 为真,那么我(可能)可以安全地将对象存储在辅助内存中,辅助内存是无符号字符数组。


附言。参考文献

我知道由于 Stackoverlow 的政策,用户可以被阻止,但他们在问题中提供和链接,但这里只是为了让读者感到舒适。如果链接将在 5 年内断开,请使用其他方式查找提及的文档。

[1] C++ 标准委员会的 C++ 标准草案 - ISOCPP: http://www.open-std.org/jtc1/sc22/wg21/docs/standards

[2] C++2011标准草案: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3242.pdf

【问题讨论】:

  • 有“标准布局类”,也有“布局兼容类”。没有“标准布局兼容”之类的东西。
  • 感谢指点。我的意思是兼容“std::is_standard_layout::value”将是真的。我会更新问题en.cppreference.com/w/cpp/types/is_standard_layout
  • @ShadowRanger 等人。您将问题标记为重复。它与什么重复?
  • 这是关于标准布局行为的精确问题。它不是重复的。更具体地说,在您提供@ShadowRanger 的链接中,关于标准布局的讨论不是用重音明确提出的。
  • @bruziuz:重复的问题和答案,专门解决标准布局及其不足之处。如果它解决了新问题所要求的问题和答案,则副本不必是完全相同的问题。 We closed another duplicate 这个问题就在上周,出于同样的原因。

标签: c++ c++11


【解决方案1】:

不,你不能,除非你想得到不变量被破坏的对象。

很容易制作一个标准的布局类型,而不是简单的可复制类型显示这一点:

struct A {
    A & operator=(A) {
        std::terminate();
    }
};

static_assert(    std::is_standard_layout   <A>::value, "");
static_assert(not std::is_trivially_copyable<A>::value, "");

如果您使用std::memcpy 复制对象,则不会调用复制赋值运算符,程序会继续执行。如果你正常复制它,程序就会停止。这说明std::memcpy不遵守该类型设置的规则。

这是一个问题的典型示例:考虑一个对象,该对象包含一个在析构函数中被释放的指针。如果你用std::memcpy复制它,你会复制指针,当析构函数运行时,你会得到一个double free。

【讨论】:

  • 感谢您的回答。我在sites.google.com/site/burlachenkok/download 中创建了这个问题的备份。因为可能问题将从 stackoverlow 中删除为重复。
  • @bruziuz:重复标记不是这样工作的。这只是意味着它对新的答案不开放,发现这个问题的人会被引导到答案的规范来源。
猜你喜欢
  • 2018-04-21
  • 2016-12-25
  • 2016-08-26
  • 2014-12-19
  • 1970-01-01
  • 2018-07-04
  • 2013-09-20
  • 2011-03-02
相关资源
最近更新 更多