复制构造函数是否有助于 C++ 中的 memcpy?

Are copy constructors helping with memcpy in C++?

提问人:daenin 提问时间:11/8/2020 最后编辑:daenin 更新时间:11/8/2020 访问量:185

问:

我正在使用基于C++的框架,该框架基于重写规则。个人重写规则是由像我这样的开发人员编写的。重写规则接口中的参数可以使用任何类型化变量进行定义。该框架似乎所做的是在应用重写规则时将 memcpy 应用于所有参数。

现在,我使用 C++ 对象的实例(从多个抽象类继承有点复杂)作为重写规则的参数。 毫不奇怪,memcpy 只取得了部分成功,在应用重写规则后,我的许多对象成员都搞砸了。特别是,指针、映射和向量成员被搞砸了。

从我所读到的内容中,我了解到 memcpy 是一种相当低级的复制机制。 我想知道是否有任何方法可以帮助解决 memcpy 期间发生的混乱? 例如,如果我为所有类定义了复制构造函数 - memcpy 是否能够使用它们? 对不起,如果这是一个愚蠢的问题。

(如果没有办法让 memcpy 适用于复杂实例,那么我会得出结论,我一直在使用的框架不适合传递对象)

C++ 复制 复制构造函数 memcpy

评论


答:

1赞 463035818_is_not_an_ai 11/8/2020 #1

std::memcpy:

将 src 指向的对象与 dest 指向的对象复制计数字节数。这两个对象都被重新解释为无符号字符数组。

memcpy复制字节。它不知道它实际复制了什么。

...Memcpy能够利用它们吗?

不。


附言

框架使用 memcpy 来复制C++对象听起来很奇怪,因为除了某些特殊情况外,这是错误的(参见 std::is_trivially_copyable)。或者,也许你误解了什么。背景太少,无法提供进一步的建议

评论

0赞 daenin 11/8/2020
非常感谢您的帮助!是的,我发现 memcpy 的使用也很奇怪。有一些关于 memcpy 的编译器警告。这是一个相当古老的框架,可能不用于传递对象,而仅适用于简单类型。因此,在这种情况下,我可能会将框架的使用延伸得太远。
0赞 463035818_is_not_an_ai 11/8/2020
@daenin我对你对“对象”和“简单类型”之间的区别有点困惑。在C++中没有这种区别(见此处 en.cppreference.com/w/cpp/language/type)。另外,为什么你使用什么框架这么秘密?;)同样在 20 年前,顺便说一句,用它来复制对象并不是一个好主意memcpy
0赞 daenin 11/8/2020
这不是秘密,我想说这只是一个极端的利基框架。它可以在“算法植物学”下找到,并使用一种名为 lpfg 的小型编程语言。