专注于c++

  C++博客 :: 首页 :: 联系 :: 聚合  :: 管理
  21 Posts :: 0 Stories :: 4 Comments :: 0 Trackbacks

常用链接

留言簿(3)

我参与的团队

搜索

  •  

最新评论

阅读排行榜

评论排行榜

 

1、为什么会产生数据对齐问题

      8CPU 当然不会产生数据对齐问题,当CPU发展到1632位时,因CPU的一次内存访问就能取回4byte(且用32位举例,这个数据理所当然的缓存在相应的32位寄存器中)——里面可能存储了41byte的数据,也可能存储了22byte的数据……,所以CPU在逻辑上将内存单元寻址地址边界设置为4的倍数(如:04812……),这是数据对齐产生的必要条件之一;另一个原因是程序中使用的数据类型并非都是4的倍数,如:char1byte),short2byte),int4byte)等等。让我们考虑一下一个2byte的的变量在内存单元中排布吧:如果这个变量地址为012,那么CPU一次内存访问就能够取得你的变量;但如果是3的话,很不幸,CPU还得访问一次内存以取得全部数据。

       2、举例说明

struct A {
    
char m_ch;     //1 Byte
    char *m_pStr;  //4 Byte
};                 //sizeof(A)=8,
4对齐

struct B {
    
char m_ch;     //1 Byte
    int m_count;   //4 Byte  
};                 //sizeof(A)=8,4对齐

struct C {
    
bool m_ok;     //1 Byte
    char m_name[6];//char 也是 1 Byte,6char罢了
};

________________________________________结构体成员________________________________ 

struct X
{
    
double m_width;      //8 Byte
    char   m_name[6];    //1 Byte per
};                       //sizeof(X)=16

struct Y {
    
int m_no;            //4 Byte
    X   m_x;             //X
8对齐,故按8对齐,
};                       //sizeof(Y)=8x3=24,提示可将X m_x扩展成struct X

 

struct X2
{
    
double m_width;      //8 Byte
    char   m_name[9];    //1 Byte per,
8字节+8字节中的一个字节
};                       //sizeof(X2)=8+8+8=24

 

struct X2
{
    
double m_width;      //8 Byte      8x1
    char   m_name[9];    //
占用8+8     8x2 8x3
};                      

struct Y2 {
    
int m_no;             //4 Byte,占用另一个8字节 8x4
    X2   m_x;             
};                       
//sizeof(Y2)=8+8+8+8=32

enum DataType {IntData,CharData,VcharData};
struct Item    
{
     
char ItemNAme[30];  //
4对齐,故是32
     DataType ItemType;  //enum4个字节
     char ItemDecr[50];  //4对齐,所以是52
     int ItemLength;     //4字节
};

sizeof(Item) = 32+4+52+4=92

 

#pragma pack(2) //指定对齐方式是2
enum DataType {IntData,CharData,VcharData};

struct Item    
{
    
char ItemNAme[30];  //30
    DataType ItemType;  //4
    char ItemDecr[50];  //50
    int ItemLength;     //4
};

sizeof(Item) = 30+4+50+4=88

posted on 2009-09-30 16:17 bellgrade 阅读(156) 评论(0)  编辑 收藏 引用 所属分类: C/C++

只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理