c++ - 在已发布的结构中添加构造函数(在 memcpy 中使用)是否安全?

标签 c++ struct

我有一个用于其他子模块的导出结构。目前它用于存储数据。客户端通常通过memcpy 复制对象而不是复制赋值。现在我想在此数据存储结构上添加一个构造函数以方便使用。

memcpy 使用的导出结构中添加成员函数是否安全? MyData 对象的内存布局是否发生变化?

编辑:

使用memcpy拷贝的方式在很多模块中已经存在。我可能无法要求他们更换它。我只是担心添加这个新的构造函数是否会破坏某些东西。

// MyData.h (Published to other modules)
struct MyData {
    int v1;
    int v2;
    /*
        MyData(): v1(1), v2(2) {}
    */
};

// Other Module's Client.cpp
MyData myData;
memcpy(&myData, &srcData, sizeof myData);

最佳答案

这是安全的,尽管您需要重新编译所有使用 MyData 的代码: 如果不这样做,你就无法逃脱。

关于使用memcpy ,您只能在对象可简单复制时执行此操作,否则程序行为未定义

如果您有任何疑问,可以使用 std::is_trivially_copyable<MyData>::value去检查。这将是 true当且仅当该对象是平凡可复制的。您甚至可以将其包装在 static_assert 中导致编译时失败。这将保护您免受某些某某人以不再适用琐碎的可复制性的方式更改您的类(例如有人教条地添加虚拟析构函数)。

你目前拥有它的方式,你的 struct 可简单复制的,即使您添加了构造函数也是如此。

尽管如果我是你,我只会依赖编译器生成的复制构造函数和赋值运算符。

关于c++ - 在已发布的结构中添加构造函数(在 memcpy 中使用)是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40781739/

相关文章:

C++ 结构指针数组

swift - 在初始化时将对象添加到列表

c++ - 对数组开头的奇数进行排序

c++ - 将 const 限定符应用于模板参数时的不同编译器行为

c++ - 带分隔符的getline

c++ - POD 变量的直接初始化不起作用,但在将变量插入 vector 时进行复制初始化

c++ - 用 Streambuilder 替换 jsoncpp FastWriter 的方法是什么?

c - C 中的压栈、出栈操作

c - C 语言编程,Stephen Kochan - 第 11 章,练习 3

C - 难以将整个结构写入共享内存