memset()初始化构造函数中的对象
memset() to initialize object in constructor?
我发现了这段使用memset()初始化对象的C++代码:
struct Message
{
Message()
{
memset(this, 0, sizeof(Message));
}
unsigned int a, b, c;
};
由于这是一个POD结构,所以这个代码应该是好的
使用memset而不是像这样的构造函数有什么好处吗
Message() : a(0), b(0), c(0) {}
这样使用memset()
没有任何优势。抛开所有明显的缺点和未来的痛苦,有一个缺点使它的效率低于
Message() : a(0), b(0), c(0) {}
这是因为POD
通常存储在阵列中。因此,在的情况下,好的(智能)编译器将有优势用单个memset()
代替数组中多个对象的初始化
Message * messages_1 = new Message[100];
或
std::vector<Message> messages_2;
messages_2.resize(100);
即使只构造一个对象,好的编译器也会在幕后使用memset()
。
请注意,在C++11和更新版本中,您有一个比这两个更好的选项:
struct Message
{
unsigned int a = 0;
unsigned int b = 0;
unsigned int c = 0;
};
这应该会产生与具有初始化列表方法的构造函数相同的代码(和优化机会),同时:
- 使用更少的代码
- 可读性更强
- 当添加成员时,无需担心更新初始化列表
- 如果
b
稍后需要默认为-1
,则无需考虑该怎么办
相关文章:
- 类中的 Arduino 对象构造函数设置垃圾值
- 编译错误:临时对象构造函数中缺少参数
- 双指针在使用 new 时不调用对象构造函数
- 以支持继承的方式将自身shared_ptr添加到对象构造函数中的向量中
- 在创建对象向量时,不为每个对象唯一调用默认对象构造函数
- GCC __attribute__((constructor)) 在对象构造函数之前调用
- 自定义对象构造函数在循环外部循环
- 从全局对象构造函数停止监视器计时器
- Arduino 上的 Sketch 停止在对象构造函数中执行
- 通过在引用线程对象来传递取消引用的“this”指针来在函数对象构造函数中创建线程是好是坏
- 为什么当对象构造函数投入新表达式时,为什么不调用DealLocation函数
- 临时结构对象构造函数奇数调用
- 未显式引用对象的全局对象构造函数在最终二进制文件 - LD 中被丢弃
- 为什么 Clang++ 不在另一个静态库中运行全局对象构造函数?
- 在未加载上下文的情况下在对象构造函数中使用OpenGL函数
- 为什么我们需要一个用户提供的const对象构造函数
- 对象构造函数的C++数组
- 将子结构值设置为对象构造函数中安全的纯虚拟函数返回的值
- C等价于新对象(构造函数)
- C++:直接在参数列表中使用数组文字的对象构造函数