首页
社区
课程
招聘
[求助]变量所占空间的字节计算问题,请教中!!!
发表于: 2013-5-22 09:48 5272

[求助]变量所占空间的字节计算问题,请教中!!!

2013-5-22 09:48
5272
typedef struct
{
        char        ss[11];
        DWORD        one;
}ok_i;

我算这个类型,应该是15字节。可是sizeof(ok_i)计算出来是16。这是怎么回事啊?

typedef struct
{
        char        ss[11];
        DWORD        one;
        char one;
}ok_i;

这个类型,我算应该是16字节,可是sizeof(ok_i)计算出来是20。这是怎么回事啊?

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 1852
活跃值: (1821)
能力值: ( LV12,RANK:230 )
在线值:
发帖
回帖
粉丝
2
字节对齐啊
2013-5-22 09:57
0
雪    币: 1122
活跃值: (1308)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
字节对齐
2013-5-22 09:59
0
雪    币: 517
活跃值: (84)
能力值: ( LV12,RANK:250 )
在线值:
发帖
回帖
粉丝
4
align,结构体内存对齐机制。默认情况下变量以CPU的一个字长对齐,目前多数是32位CPU,所以结构体变量都以DWORD对齐。于是:
typedef struct
{
  char  ss[11];  //占用3个dword即12byte,最后一个byte无用被用以后继数据对齐
  DWORD  one;
}ok_i;
而:
typedef struct
{
  char  ss[11];   //同上
  DWORD  one;
        char one;  //这个变量占用一个dword空间即4byte
}ok_i;
但是一般编译器对同类型数据有合并优化,如果你定义这样的结构:

    typedef struct
    {
    char  ss[11];
    char on;
    DWORD  one;
    }ok_i;
那么,你应该能得到想要的结果sizeof(ok_i) == 16。
另外,如果你非得要自己那么写结构体,又希望sizeof()如你所愿。可以这么写:
#pragma pack (push,1)  //强制1byte对齐
typedef struct
{
  char  ss[11];
  DWORD  one;
}ok_i;
#pragma pack (pop) //恢复默认对齐
sizeof(ok_i) == 15 , as your wish.
2013-5-22 10:02
0
雪    币: 213
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
[QUOTE=triones;1179705]align,结构体内存对齐机制。默认情况下变量以CPU的一个字长对齐,目前多数是32位CPU,所以结构体变量都以DWORD对齐。于是:
typedef struct
{
  char  ss[11];  //占用3个dword即12byte,最后一个byte无用被用以后继数据对齐
  DWORD  ...[/QUOTE]

这样貌似不好吧.这种潜规则,导致字节计算不准确.我怎么知道什么时候填空字节呀!?
2013-5-22 10:18
0
雪    币: 517
活跃值: (84)
能力值: ( LV12,RANK:250 )
在线值:
发帖
回帖
粉丝
6
基本所有编译器都是这个规则,这个规则的制定是为了提高CPU的数据访问速度,利大于弊。
你要不就接受它,要不就在自己的代码写上#pragma pack (push,1),要不就设置编译选项:C/C++>>>代码生成>>>结构成员对齐(1字节 /Zp1)
注意强制对齐可能会影响你的程序执行效率。
2013-5-22 10:24
0
雪    币: 213
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
那为啥这个结构没见填充字节呢?我调试看sizeof结果也就是32。没见填充字节呀,按说每个变量都不够整字长,应该填充很多呀!?

typedef struct
{
        char        nn[11];                       
        char        ss[15];                       
        char        pp[5];                       
        char        t;                       
}Item;
2013-5-23 12:02
0
雪    币: 517
活跃值: (84)
能力值: ( LV12,RANK:250 )
在线值:
发帖
回帖
粉丝
8
注意我之前有提醒过你:
[QUOTE=triones;1179705]
但是一般编译器对同类型数据有合并优化,如果你定义这样的结构:

    typedef struct
    {
    char  ss[11];
    char on;
    DWORD  one;
    }ok_i;
那么,你应该能得到想要的结果sizeof(ok_i) == 16。
[/QUOTE]

编译器对连续的、同类型数据,有合并优化
2013-5-27 10:06
0
雪    币: 270
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
不是按每个变量给你对齐的,
2013-5-27 22:30
0
雪    币: 270
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
你那几个char总共32字节,而且连续的,4的倍数,不用对齐了。
2013-5-27 22:32
0
游客
登录 | 注册 方可回帖
返回
//