本質上來說和結構體是一樣的,但是從包裝的角度來看有差異。
1、union中可以定義多個成員,union的大小由最大的成員的大小決定。
2、union成員共享同一塊大小的記憶體,一次只能使用其中的一個成員。
3、對某一個成員賦值,會覆蓋其他成員的值(也不奇怪,因為他們共享一塊記憶體。但前提是成員所佔位元組數相同,當成員所佔位元組數不同時只會覆蓋相應位元組上的值,比如對char成員賦值就不會把整個int成員覆蓋掉,因為char只佔一個位元組,而int佔四個位元組)4、聯合體union的存放順序是所有成員都從低地址開始存放的。下面看一個簡單的程式碼:具體用法舉例:struct Matrix{ union { struct { float _f11, _f12, _f13, _f21, _f22, _f23, _f31, _f32, _f33; }; float f[3][3]; }_matrix;};struct Matrix m;#define TRUE 1#define FALSE 0#define BOOL intBOOL isBigEndian(){ int i = 1; /* i = 0x00000001*/ char c = *(char *)&i; /* 注意不能寫成 char c = (char)i; */ return (int )c != i;}BOOL isBigEndian(){ union { int i; char c; }test; test.c = 2; return test.i != 2;}long long htonLL(long long lg){ union { struct { long low; long high; }val_1; long long val_2; }val_arg, val_ret; if ( isBigEndian() ) return lg; val_arg.val_2 = lg; val_ret.val_1.low = htonl( val_arg.val_1.high ); val_ret.val_1.high = htonl( val_arg.val_1.low ); return val_ret.val_2;}class Test{public : float getFVal(){ return f;}private : int i; char c; float f;};Test t;class Test_Cpy{ public : float getVal(){ return f;} float setVal(float f){ this ->f = f;}private : int i; char c; float f;};....int main(){ Test t; union { Test t1, Test_Cpy t2; }test; test.t2.setVal(7.0f); t = test.t1; assert( t.getVal() == 7.0f ); return 0;}
本質上來說和結構體是一樣的,但是從包裝的角度來看有差異。
1、union中可以定義多個成員,union的大小由最大的成員的大小決定。
2、union成員共享同一塊大小的記憶體,一次只能使用其中的一個成員。
3、對某一個成員賦值,會覆蓋其他成員的值(也不奇怪,因為他們共享一塊記憶體。但前提是成員所佔位元組數相同,當成員所佔位元組數不同時只會覆蓋相應位元組上的值,比如對char成員賦值就不會把整個int成員覆蓋掉,因為char只佔一個位元組,而int佔四個位元組)4、聯合體union的存放順序是所有成員都從低地址開始存放的。下面看一個簡單的程式碼:具體用法舉例:struct Matrix{ union { struct { float _f11, _f12, _f13, _f21, _f22, _f23, _f31, _f32, _f33; }; float f[3][3]; }_matrix;};struct Matrix m;#define TRUE 1#define FALSE 0#define BOOL intBOOL isBigEndian(){ int i = 1; /* i = 0x00000001*/ char c = *(char *)&i; /* 注意不能寫成 char c = (char)i; */ return (int )c != i;}BOOL isBigEndian(){ union { int i; char c; }test; test.c = 2; return test.i != 2;}long long htonLL(long long lg){ union { struct { long low; long high; }val_1; long long val_2; }val_arg, val_ret; if ( isBigEndian() ) return lg; val_arg.val_2 = lg; val_ret.val_1.low = htonl( val_arg.val_1.high ); val_ret.val_1.high = htonl( val_arg.val_1.low ); return val_ret.val_2;}class Test{public : float getFVal(){ return f;}private : int i; char c; float f;};Test t;class Test_Cpy{ public : float getVal(){ return f;} float setVal(float f){ this ->f = f;}private : int i; char c; float f;};....int main(){ Test t; union { Test t1, Test_Cpy t2; }test; test.t2.setVal(7.0f); t = test.t1; assert( t.getVal() == 7.0f ); return 0;}