织梦CMS - 轻松建站从此开始!

罗索

struct 与 union 的区别

落鹤生 发布于 2010-12-31 10:08 点击:次 
在编程的时候,经常会遇到使用一个变量处理多种数据的情况,在这种情况下,如果我们不考虑使用类,那么就可以是struct(结构)和union(联合)来进行处理。那么,这两种结构之间到底有什么不同呢?
TAG:

在编程的时候,经常会遇到使用一个变量处理多种数据的情况,在这种情况下,如果我们不考虑使用类,那么就可以是struct(结构)和union(联合)来进行处理。那么,这两种结构之间到底有什么不同呢?

可以先看下面的一个小例子。

  1. #include  < iostream > 
  2. using   namespace  std; 
  3.  
  4. union U1  { 
  5. char  c; 
  6. int  i; 
  7. double  d; 
  8. } ; 
  9. union U2  { 
  10. char  c; 
  11. // int i; 
  12. // double d; 
  13. } ; 
  14.  
  15. union U3{ 
  16. char  c; 
  17. int  i; 
  18. // double d; 
  19. } ; 
  20.  
  21. struct  S1  { 
  22. char  c; 
  23. int  i; 
  24. double  d; 
  25. } ; 
  26.  
  27. struct  S2  { 
  28. char  c; 
  29. int  i; 
  30. // double d; 
  31. } ; 
  32.  
  33. int  main()  { 
  34. cout << " U1's size = " << sizeof (U1) << endl; 
  35. cout << " U2's size = " << sizeof (U2) << endl; 
  36. cout << " U3's size = " << sizeof (U3) << endl; 
  37. cout << endl; 
  38. cout << " -------------------------------- " << endl; 
  39. cout << " S1's size = " << sizeof (S1) << endl; 
  40. cout << " 其中 " << sizeof ( char ) << " + " << sizeof ( int ) << " + "
  41.  << sizeof ( double ) << " = " << sizeof ( char ) + sizeof ( int ) + sizeof ( double )
  42.  << endl; 
  43. cout << " ---------- " << endl; 
  44. cout << " S2's size = " << sizeof (S2) << endl; 
  45. cout << " 其中 " << sizeof ( char ) << " + " << sizeof ( int ) << " = "
  46.  << sizeof ( char ) + sizeof ( int ) << endl; 
  47. cout << " -------------------------------- " << endl; 
  48. S1 s; 
  49. s.c = ' A ' ; 
  50. cout << " 1 s.c =  " << s.c << endl; 
  51. s.d = 23.2132 ; 
  52. cout << " 1 s.d =  " << s.d << endl; 
  53.  
  54. cout << " 2 s.c =  " << s.c << endl; 
  55. cout << " 2 s.d =  " << s.d << endl; 
  56. cout << " -----------------------  " << endl; 
  57. U1 u; 
  58. u.c = ' A ' ; 
  59. cout << " 1 u.c =  " << u.c << endl; 
  60.  
  61. u.i = 23322 ; 
  62. cout << " 1 u.i =  " << u.i << endl; 
  63.  
  64. u.d = 23.2132 ; 
  65. cout << " 1 u.d =  " << u.d << endl; 
  66. cout << " 2 u.c =  " << u.c << endl; 
  67. cout << " 2 u.i =  " << u.i << endl; 
  68. return   0 ; 
  69. }  



输出结果为:

U1's size =8
U2's size =1
U3's size =4

--------------------------------

S1's size =16

其中 1+4+8=13

----------

S2's size =8

其中 1+4=5

--------------------------------

1 s.c = A
1 s.d = 23.2132
2 s.c = A
2 s.d = 23.2132

-----------------------

1 u.c = A
1 u.i = 23322
1 u.d = 23.2132
2 u.c =
2 u.i = 1181975000

解释:

struct 类型的内存分配是结合内部的所有变量大小和相关的,但不是简单的相加,从上面的例子就可以看出来, struct 类型的分配的内存大小是应该内部最大数据类型的整数倍,不足一倍的部分会自动补全成一倍大小,应该是编译器为了数据整齐,处理速度会快些把。 union 类型的内存分配,只是和联合体内的最大的一个数据类型的大小相关,而且 union 内的所有数据都在一个单独的内存空间里面。这些就是上面程序出现这样的结果的原因。

所以, u.c 的值是 A ,当给联合体内的其他变量赋值之后, u.c 的值就是一个无用的信息。同样, u.i 的值最初是 23322 ,当给 u.d 赋值 23.2132 之后, u.i 的值就变得无用了。

 

(秩名)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201012/10698.html]
本文出处:网络 作者:秩名
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容