zoukankan      html  css  js  c++  java
  • offset宏的讲解【转】

    转自:http://blog.csdn.net/tigerjibo/article/details/8299584

    1.offset宏讲解

    #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE*)0)->MEMBER)

    对这个宏的讲解我们大致可以分为以下4步进行讲解:

    1>( (TYPE *)0 )  0地址强制 "转换 TYPE结构类型的指针;

    2>((TYPE *)0)->MEMBER   访问TYPE结构中的MEMBER数据成员;

    3>&( ( (TYPE *)0 )->MEMBER)取出TYPE结构中的数据成员MEMBER的地址;

    4>(size_t)(&(((TYPE*)0)->MEMBER))结果转换为size_t类型。

    offsetof的巧妙之处在于将0地址强制转换为 TYPE结构类型的指针,TYPE结构以内存空间首地址0作为起始地址,则成员地址自然为偏移地址。可能有的读者会想是不是非要用0呢?当然不是,我们仅仅是为了计算的简便。也可以使用是他的值,只是算出来的结果还要再减去该数值才是偏移地址。来看看如下的代码:

      #include<stdio.h>

      #defineoffsetof(TYPE, MEMBER) ((size_t) &((TYPE *)4)->MEMBER)

       struct test_struct {

               int num;

               char ch;

              float f1;

      };

     int main(void)

      {

         printf("offsetof (struct test_struct,num)=%d ",offsetof(struct test_struct,num)-4);

         printf("offsetof (structtest_struct,ch) =%d ",offsetof(struct test_struct,ch)-4);

         printf("offsetof (struct test_struct,f1)=%d ",offsetof(struct test_struct,f1)-4);

              return 0;

      }

    运行结果为:

    jibo@jibo-VirtualBox:~/cv_work/work/list/offset $ ./main

    offsetof (struct test_struct,num) =0

    offsetof (struct test_struct,ch) =4

    offsetof (struct test_struct,f1) =8

    为了让大家加深印象,我们在代码中没有使用0,而是使用的4,所以在最终计算出的结果部分减去了一个4才是偏移地址,当然实际使用中我们都是用的是0

    二.举例体会offsetof宏的使用:

      #include<stdio.h>

      #defineoffsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)

       struct test_struct {

               int num;

               char ch;

              float f1;

      };

     int main(void)

      {

          printf("offsetof(struct test_struct,num) =%d ",offsetof(struct test_struct,num));

         printf("offsetof (structtest_struct,ch) =%d ",offsetof(struct test_struct,ch));

         printf("offsetof (struct test_struct,f1)=%d ",offsetof(struct test_struct,f1));

              return 0;

      }

    执行结果为:

    jibo@jibo-VirtualBox:~/cv_work/work/list/offset $ ./main

    offsetof (struct test_struct,num) =0

    offsetof (struct test_struct,ch) =4

    offsetof (struct test_struct,f1) =8

  • 相关阅读:
    GCC内置函数
    父类子类的拷贝构造与赋值
    外传三 动态内存申请的结果
    外传二 函数的异常规格说明
    外传一 异常处理深度解析
    第69课 技巧,自定义内存管理
    第68课 拾遗,令人迷惑的写法
    第67课 经典问题解析五
    第66课 C++中的类型识别
    第65课 C++中的异常处理(下)
  • 原文地址:https://www.cnblogs.com/sky-heaven/p/8334380.html
Copyright © 2011-2022 走看看