C++: 使用aggregate initialization代替memset来初始化结构体。

在C里面经常使用memset来把一个结构体的内容全部设置为0。

memset(ps, 0, sizeof(S));

在C++11里面,利用aggregate initialization特性,可以写的更加好看。

void foo(S *ps){
    *ps = { 0 }; // use aggregate initialization
}

*ps = { 0 };实际发生的事情是ps->operator=({ 0 });。在没有优化的情况下,{ 0 }实际上构造了一个struct S的临时对象,然后传给了opeator=这个函数。

PS:*ps = { 0 };memset的行为还是有一定区别的。如果struct S里面有padding的数据的话,那么memset也会把padding的数据也设置成0,而*ps = { 0 };不会。

测试代码(ideone)

#include 
#include 
using namespace std;
struct S {
    int x;
//private:
    S& operator=(const S& other){
        cout << "Address of this  " << this << endl;
        cout << "Address of other " << &other << endl;
        return *this; 
    };
};

void foo(S *ps){
    memset(ps, 0, sizeof(S)); // old C way
    *ps = { 0 }; // use aggregate initialization
}
int main(void)
{
    S s = { 2 };
    foo(&s);
    return 0;
}

VS2013下输出是

Address of this 0046FA84
Address of other 0046F8E0

你可能感兴趣的:(C++: 使用aggregate initialization代替memset来初始化结构体。)