c语言大小端问题

来源:互联网 发布:2016手机赚钱软件大全 编辑:程序博客网 时间:2024/04/27 20:45

1 大小端问题
在计算机中存在两种字节序:大端和小端,大端是指计算机中表示一个数时高位在前,低位在后,也就是说低地址存放数据的高位部分,而高地址存放数据的低位部 分,如PPC就是属于这种类型的;相对的,小端是指计算机存储数据时低位在前,高位在后,即低地址存放数据的低位部分,高地址存放数据的高位部分,我们天 天用的X86 CPU就是这样的。
   例如: 0x12345678在大小端系统中分别表示如下:
   Address      : 0x500 0x501 0x502 0x503
           +-------+------+-------+-------+
LittleEndian : | 0x78 | 0x56 | 0x34 | 0x12 |
       +-------+------+-------+-------+
           +-------+------+-------+-------+
BigEndian    : | 0x12 | 0x34 | 0x56 | 0x78 |
       +-------+------+-------+-------+
可以用如下方法来判断一个CPU的大小端:
boolean IsBigEndian(void)
{
      U16 wTest = 0x1234;
      U8* puTest = (U8*)&wTest;
      if (0x12 == puTest[0])
      {
          return true;
      }
      else
      {
          return false;
      }
}
2 字节对齐问题
    我们先来看这样一个问题:
    typedef struct
    {
    U8   bFieldA;
        U16 wFieldB;
        U8   bFieldC;
        U32 dwFieldD;
    }STRUCT_A;

    typedef struct
    {
    U8   bFieldA;
        U8   bFieldC;
        U16 wFieldB;
        U32 dwFieldD;
    }STRUCT_B;
    请问:sizeof(STRUCT_A) = ? sizeof(STRUCT_B) = ?
    这个问题涉及的就是字节序问题,字节序问题关系到数据结构设计的是否合理,合理的数据结构设计可以节省内存空间,同时还能够提高数据访问效率,这在资源有限的其嵌入式系统中是非常重要的.
    在一个四字节对齐的系统中,STRUCT_A占用的内存空间为12字节,而STRUCT_B占用的内存空间则是8字节,比STRUCT_A少了4个字节!从这里我们就可以看出字节对齐的重要性了!
    那么字节到底怎么对齐呢?为什么会有字节对齐的问题呢?引起这个问题的主要原因是CPU的机器字设计。机器字是指CPU一次内存访问指令能够读取的字节个 数,四字节对齐的CPU中,一条内存访问指令可以读取四个字节。而编译器生成数据结构时一般都会保证数据访问效率最高,即基本数据类型 (U8/U16/U32)要保证一条指令就能够访问完,于是就产生了U8类型1字节对齐,U16类型2字节对齐,U32类型四字节对齐。这样我们就可以看 看上面两个结构中,各个域的内存占用情况:
在STRUCT_A中,bFieldA单对齐,占用一个字节;wFieldB双字节对齐,为了保证wFieldB能够自然对齐,在bFieldA之后就会 空出一个字节,从第三个字节开始;bFieldC单字节对齐;dwFieldD四字节对齐,为了保证dwFieldD能够自然对齐,在bFieldC之后 就会空出三个字节,这样算来整个结构共占用12个字节(包含了三个空余字节),其内存结构如下图(*表示预留字节):
         +-----+-----+----+----+----+----+----+----+----+----+----+----+
          | A   |    *   | B | B | C |   * |   * |   * | D   | D   | D   | D |
         +-----+-----+----+----+----+----+----+----+----+----+----+----+
类似的,STRUCT_B结构内存结构如下:
         +-----+-----+----+----+----+----+----+----+
          | A    | C   | B | B | D | D | D | D |
         +-----+-----+----+----+----+----+----+----+
从这个简单的例子我们可以看出,即使结构的所有内容相同,仅仅结构中数据成员排序的不同都会引起数据结构所占内存空间的很大的区别!

原创粉丝点击