我有一个用于其他子模块的导出结构。目前它用于存储数据。客户端通常通过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/