用用户定义的默认构造函数memset普通结构是否安全
Is it safe to memset the plain struct with user-defined default constructor?
我知道,如果C++结构是纯旧数据("POD"),那么这就保证了它的内存结构中没有魔法,所以这意味着字节数组的memcpy
和返回的memcpy
是安全的。
我还知道,在标准中,POD结构不应该有用户定义的构造函数。在我现在拥有的项目中,有一些简单的结构(只有数据字段),定义了一个默认的构造函数,将数据成员初始化为0。我看到其他客户端在使用该结构之前会使用memset(&obj, 0, sizeof obj);
。
在我使用非POD结构之前,memset
可以还是安全?
拥有构造函数不会使struct
成为非POD。
如果聚合类没有用户定义的复制赋值运算符和析构函数,并且它的非静态成员都不是非POD类、非POD数组或引用,则该聚合类称为POD。
鉴于此,调用是完全安全的
memset(&obj, 0, sizeof obj);
在具有构造函数的CCD_ 6的对象上,只要它是POD。
它是否可以,取决于。如果struct
的默认构造函数希望将成员初始化为1
以实现正常行为,则对memset
的上述调用可能会影响依赖于1
作为默认值的代码的行为。
以以下struct
:为例
struct Direction
{
Direction() : x(1.0), y(0.0), z(0.0) {}
double x;
double y;
double z;
};
类型为Direction
的对象期望至少一个组件是非零的。当所有零部件都为零时,无法定义方向。如果使用memset
将所有内容设置为0
,则代码可能会中断。
编辑从下面的评论来看,POD的定义似乎从C++03变成了C++11。
使用CCD_ 15可能并不安全。
IMO这取决于用例。我见过在一些大型机应用程序(如)上使用内存集设置带有空白字符的数据
memset(&obj, ' ', sizeof(obj));
如果结构定义了一个常量变量并初始化该值,则memset将覆盖该值。因此,使用memset对PODS进行初始化取决于情况,而且在大多数情况下是安全的。那是我的2美分。
- 具有引用成员的结构是否具有唯一的对象表示形式
- 用户定义的结构是否有默认C++比较器?
- 具有指向函数的指针的类内的结构是否需要类外函数的前向声明
- 助推.测试检查结构是否相等
- 使用字节数组具有单字节对齐方式的结构是否安全
- 在 for 循环中声明结构是否合法C++?
- 包含打包结构的结构是否自行打包?
- C++中的结构是否按顺序分配内存?每次都以某种方式获得指针比较的正确答案
- 使用运营商New分配的数据结构是否有任何副作用
- 标准库容器结构是否存储副本或引用?
- openMP 的 SIMD 结构是否需要特定类型的硬件?
- 检查 c++ 结构是否在集合中
- 在字节数组上转换具有虚函数的结构是否安全?
- std::unordered_map 如何释放使用 malloc 创建的结构.是否需要对地图进行 2 次查询
- Qt:通过深度复制访问列表中的数据结构是否应该比通过指针访问它慢得多
- 浮点结构是否有任何填充
- 在头文件中完成实现的结构是否需要 __attribute__((可见性( "default" )))?(C++)
- 检查结构是否不在矢量中
- C++:类/结构是否在编译时初始化过
- 对结构进行操作并将结果分配给同一结构是否是一种不好的做法?为什么