【发布时间】:2013-07-23 12:26:57
【问题描述】:
我从 SO 上发布的几个问题中了解到这一段。
我不太明白为什么不能保证memcpy 对于非 POD 类型是安全的。我的理解是memcpy 只是按位复制。
以下是标准的引用
对于
POD类型T的任何对象(基类子对象除外),无论该对象是否拥有T类型的有效值, 构成对象的底层字节(1.7)可以复制到char或unsigned char.41的数组中)如果内容char或unsigned char的数组被复制回对象中,对象随后应保持其原始 价值。# define N sizeof (T) char buf[N]; T obj ; // obj initialized to its original value std :: memcpy (buf , & obj , N); // between these two calls to std::memcpy, // obj might be modified std :: memcpy (& obj , buf , N); // at this point, each subobject of obj of // scalar type holds its original value
【问题讨论】:
-
如果定义了一个复制构造函数而不是按位复制会发生什么?
-
memcpy是按位复制。非 POD 类型不一定表现出按位复制语义。 -
@LeonLi 不是。原始值不是原始字节。
-
@R.M.F 我仍然很困惑......为什么在两个 memcpy 之后不能保留“原始值”。如果 memcpy 只是按位操作,那么在 memcpy 期间可能会发生什么变化。
-
从中吸取的教训是,C++ 是一种高级语言,具有低级逃生舱口,而不是低级语言。停止考虑位和字节,开始考虑值、对象和数字。
标签: c++