【回転】データ位置合わせ

5970 ワード

               ,              ,        ,             。                ,                   。

      :http://www.cnblogs.com/bakari/archive/2012/08/27/2658956.html

 、       

1、              byte   ,                           ,                            ,                      ,              ,     。

2、               ,            。   ,1          ,2          2  ,4          4  。

3、                     ,  C P U      。

4、  C P U          ,        。                0 ,      。  , W O R D       2       , D W O R D       4       ,    。 C P U               , C P U          。            ,              ,             。

 

 、     

1、                        。                           。            ,                              ,           。                 ,    int (    32 )             ,            ,              ,      2    ,                        int  。            。           。

2、              。                        ,        ,              ,      。            。           ,                          。
 

 、       

  ,        ,         。                    。  ,                               。

1、                ,                     ?       ,        :http://blog.csdn.net/arethe/article/details/2548867,                       。

2、            ,    (     )     

1)、    

             VS2003-VS2010,CB,DEV C++        ,    8 , #pragma pack(value) value = 8。

        


 1 #include <iostream>
 2 using namespace std;
 3 
 4 struct A
 5 {
 6     char _iC1;
 7     long _il;
 8     char _iC2;
 9     double _id;
10 };
11 //    
12 struct B
13 {
14     char _iC1;
15     char _iC2;
16     long _il;
17     double _id;
18 };
19 int main(){
20     cout << sizeof(A) << endl;
21     cout << sizeof(B) << endl;
22 
23     return 0;
24 }

  :

        A:_iC1     ,long   4   ,      long      ,    3   ,    cc  ,   3cc(  ),_il  4   ,_iC2 1   ,   double  ,  7cc,  _id  8   。  sizeof(A) = 1+3+4+1+7+8 = 24   。

        B:  ,sizeof(B) = 1+1+2+4+8 = 16

  :



   :

                               sizeof(  )     。                sizeof(   )   。                              ,          。

 

2)、    ,     #pragma pack(value)  value  


 1 #include <iostream>
 2 using namespace std;
 3 
 4 #pragma pack(4)     //Note!
 5 struct A
 6 {
 7     char _iC1;
 8     long _il;
 9     char _iC2;
10     double _id;
11 };
12 #pragma pack()
13 //    
14 struct B
15 {
16     char _iC1;
17     char _iC2;
18     long _il;
19     double _id;
20 };
21 int main(){
22     cout << sizeof(A) << endl;
23     cout << sizeof(B) << endl;
24 
25     return 0;
26 }



  :  sizeof(A) = 20

   :      _iC2          ,_iC2         double      ,             (          )    ,4 < 8,        4.  :

sizeof(A) = 1+3+4+1+3+8 = 20

                       ,    :

  #pragma pack(n)             :  、  n              ,                ,       。  、  n               ,      n   ,           。             ,       :  n                 ,                             ;      n   。

 

 、                     

     ,          ,                   。

  1:
struct Practice1 
{
  char _szA[123];
  int _iB;	
  float _iC;
  double _dD;
};
1、	               ,                    。
2、	           #pragma pack(2),    #pragma pack(),    ,       ?

  2:

struct Practice2 
{
  struct T1
  {
    char _cA;
    int _iB;
    float _fC;
   } _objX;
  int _iD;
  char _iE;
};
1、	               ,                    。
2、	           #pragma pack(4),    #pragma pack(),    ,       ?

  3:

struct Practice3 
{
  union T1
  {
    char _cT;
    double _dT;
    int _iT;
  } _uT;
  int _iA;
  double _dB;
};
1、	               ,                    。
2、	           #pragma pack(1),    #pragma pack(),    ,       ?

 

    :

  :

  1:

(1)      8, 0x0000  ,  #pragma pack(8)
  char _szA[123]; 123+cc……cc=124
  int _iB; 124+4=128
  float _iC; 128+4 +cc +...+cc = 132 + 4cc = 136
  double _dD; 136+8=144
    (2) #pragma pack(2)
      :123+cc+4+4+8=140

  2:

(1)#pragma pack(8)

struct T1
{
  char _cA; 1+cc…+cc=4
  int _iB; 4+4=8
  float _fC; 8+4=12
} _objX; 12
int _iD; 12+4=16
char _iE; 16+1 = 17+cc+…+cc = 20
     :20

(2) #pragma pack(4)
 :1+cc+cc+cc+4+4+4+1+cc+cc+cc=20

  3:

(1) #pragma pack(8)
union T1
{
  char _cT;
  double _dT; 8
  int _iT;
} _uT; 8
int _iA; 8+4+cc…+cc=16
double _dB; 16+8 =24
(2) #pragma pack(1)
  :8+4+8=20

  :


 1 #include <iostream>
 2 using namespace std;
 3 
 4 struct Practice1
 5 {
 6     char _szA[123];
 7     int _iA;
 8     float _iB;
 9     double _iD;
10 };
11 
12 struct Practice2
13 {
14     struct T1
15     {
16         char    _cA;
17         int     _iB;
18         float   _fC;
19     }       _objX;
20     int     _iD;
21     char    _iE;
22 };
23 
24 struct Practice3
25 {
26     union T1
27     {
28         char   _cT;
29         double _dT;
30         int    _iT;
31     }   _uT;
32     int     _iA;
33     double  _dB;
34 };
35 
36 int main(){
37     cout << sizeof(Practice1) << endl;
38     cout << sizeof(Practice2) << endl;
39     cout << sizeof(Practice3) << endl;
40     return 0;
41 }




 1 #include <iostream>
 2 using namespace std;
 3 
 4 #pragma pack(2)
 5 struct Practice1
 6 {
 7     char _szA[123];
 8     int _iA;
 9     float _iB;
10     double _iD;
11 };
12 #pragma pack()
13 
14 #pragma pack(4)
15 struct Practice2
16 {
17     struct T1
18     {
19         char    _cA;
20         int     _iB;
21         float   _fC;
22     }       _objX;
23     int     _iD;
24     char    _iE;
25 };
26 #pragma pack()
27 
28 #pragma pack(1)
29 struct Practice3
30 {
31     union T1
32     {
33         char   _cT;
34         double _dT;
35         int    _iT;
36     }   _uT;
37     int     _iA;
38     double  _dB;
39 };
40 #pragma pack()
41 
42 int main(){
43     cout << sizeof(Practice1) << endl;
44     cout << sizeof(Practice2) << endl;
45     cout << sizeof(Practice3) << endl;
46     return 0;
47 }