【问题标题】:Are copy constructors helping with memcpy in C++?复制构造函数是否有助于 C++ 中的 memcpy?
【发布时间】:2021-02-20 04:43:25
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: c++ copy copy-constructor memcpy


    【解决方案1】:

    std::memcpy:

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

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

    ... memcpy 可以使用它们吗?

    没有。


    PS

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

    【讨论】:

    • 非常感谢您的帮助!是的,我觉得 memcpy 的使用也很奇怪。有一些关于 memcpy 的编译器警告。这是一个相当古老的框架,可能不适合传递对象,但仅适用于简单类型。所以在这种情况下,我可能会过度使用框架。
    • @daenin 您对“对象”和“简单类型”之间的区别感到有些困惑。 C++ 中没有这样的区别(请参阅此处en.cppreference.com/w/cpp/language/type)。另外,为什么您使用的框架如此秘密? ;) 同样在 20 年前,使用 memcpy 来复制对象并不是一个好主意
    • 这不是什么秘密,我想说的只是一个极端的小众框架。它可以在“算法植物学”下找到,并使用一种名为 lpfg 的小型编程语言。
    猜你喜欢
    • 2013-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多