在C里面經(jīng)常使用memset來把一個(gè)結(jié)構(gòu)體的內(nèi)容全部設(shè)置為0抑钟。
memset(ps, 0, sizeof(S));
在C++11里面德迹,利用aggregate initialization特性,可以寫的更加好看。
void foo(S *ps){
*ps = { 0 }; // use aggregate initialization
}
*ps = { 0 };
實(shí)際發(fā)生的事情是ps->operator=({ 0 });
抑淫。在沒有優(yōu)化的情況下绷落,{ 0 }
實(shí)際上構(gòu)造了一個(gè)struct S
的臨時(shí)對(duì)象,然后傳給了opeator=
這個(gè)函數(shù)始苇。
PS:*ps = { 0 };
和memset
的行為還是有一定區(qū)別的砌烁。如果struct S
里面有padding的數(shù)據(jù)的話,那么memset也會(huì)把padding的數(shù)據(jù)也設(shè)置成0催式,而*ps = { 0 };
不會(huì)函喉。
測(cè)試代碼(ideone)
#include <string.h>
#include <iostream>
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