首页
社区
课程
招聘
[原创]对sizeof()操作符的理解
2008-4-30 13:20 5808

[原创]对sizeof()操作符的理解

2008-4-30 13:20
5808
本来想在google上看看#pragma pack(1)是什么意思的,却看到它还会对sizeof操作符有影响,所以就想搞清楚它们.
在google上有很多文章(可以先看看)都讲了它们的关系,可是都感觉很乱,所以自己总结了一下.
#pragma pack(x)是通知编译器内存对齐的指令
sizeof()是返回一个对象或类型名的字节长度的操作符

文字叙述:
如果定义了#pragma pack(x),判断x是否小于结构中最大的数据类型字节数
是:结构中各个数据类型按x对齐,
否:按默认对齐
没有定义#pragma pack(x),按默认对齐

默认对齐是这样子的:
如果当前数据类型不是最后一个,而且当前数据类型字节数小于下一个数据类型字节数,则当前数据类型字节数按下一个数据类型字节数对齐
最后,结构总字节数按最大数据类型字节数对齐


伪代码叙述:
void 按默认对齐()
{
   for(i=0;i<数据类型个数;++i)
   {
      if(当前数据类型<>最后一个数据类型&&当前数据类型字节数<下一个数据类型字节数)
         当前数据类型字节数按下一个数据类型字节数对齐;
   }
   结构总字节数按最大数据类型字节数对齐;
}

if(#pragma pack(x)==exist)
{
   if(x<结构中最大数据类型字节数)
     结构中各个数据类型按x对齐;
   else
     按默认对齐();
}
else
按默认对齐();


大家可以做做实验验证一下
我提供一下网络上别人的实验:
来源
struct sample1
{
    char a;        /// sizeof(char) = 1
    double b;    /// sizeof(double) = 8
};
///default 16
#pragma pack( 4 )   12
#pragma pack( 2 )   10
#pragma pack( 1 )   9
#pragma pack( 16 ) 16

struct sample2
{
    char a;     ///1
    int b;        ///4
};
#pragma pack( 8 )    8
#pragma pack( 16 )  8

struct sample3
{
    char a;  ///1
    int b;    ///4
    char c;  ///1
};
///default                  ///12
#pragma pack( 4 )   ///12
#pragma pack( 2 )   ///08
#pragma pack( 1 )   ///06
#pragma pack( 16 ) ///12

struct sample4
{
    char a;      ///1
    int b;         ///4
    double c;  ///8
    char d;      ///1
};
///default:                ///24
#pragma pack( 4 )   ///20
#pragma pack( 2 )   ///16
#pragma pack( 1 )   ///14
#pragma pack( 16 ) ///24

struct sample5
{
    char a;      ///1
    double c;  ///8
    int b;         ///4
    char d;      ///1
};
编译器给出结果:24、20、16、14、24

[培训]二进制漏洞攻防(第3期);满10人开班;模糊测试与工具使用二次开发;网络协议漏洞挖掘;Linux内核漏洞挖掘与利用;AOSP漏洞挖掘与利用;代码审计。

收藏
点赞7
打赏
分享
最新回复 (4)
雪    币: 208
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
lovefasm 2008-4-30 13:38
2
0
sizeof不是函数,是操作符好不?
雪    币: 243
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
hpxpj 1 2008-4-30 17:32
3
0
sizeof是C语言的一种单目操作符,如C语言的其他操作符++、--等。它并不是函数

不好意思,以前误认为是函数了
雪    币: 210
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wpclub 2008-4-30 22:33
4
0
c++ primer 4th上面介绍的应该是最详细的了
雪    币: 466
活跃值: (119)
能力值: ( LV9,RANK:190 )
在线值:
发帖
回帖
粉丝
kusky 4 2008-5-3 23:12
5
0
鼓励楼主。~~
游客
登录 | 注册 方可回帖
返回