zoukankan      html  css  js  c++  java
  • 获取结构体某成员偏移

      本身这个问题非常简单,直接用地址差值即可求得,最近在某本书上看到了一个非常牛的方法,第一次看还将信将疑觉得不太可能,后面上机验证发现确实可以,代码如下:

      

    1 #include <iostream>
    2
    3  using namespace std;
    4
    5
    6  struct test
    7 {
    8 int a;
    9 int b;
    10 char c;
    11 int d;
    12 };
    13
    14 #define FIND(structTest,e) (size_t)&(((structTest*)0)->e)
    15
    16 int main()
    17 {
    18 size_t s = FIND(test,b);
    19 //test t;
    20 cout<<s<<endl;
    21
    22 char c;
    23 cin>>c;
    24 return 0;
    25 }

      仔细看第14行代码,发现这个宏非常奇怪,没错,就是用来求偏移的。我们知道宏的本质是替换,在预编译的时候会替换代码,那么里面有什么玄机了?我发现其实此法是用了欺骗编译器的技巧来求得偏移的。取地址符‘&’决定表达式不会出现访问内存错误,因为默认0强制转化为结构体指针类型后是不能访问的地址,由于有地址符,所以不会实际产生访问变量的代码。而‘->’最本质的就是队0加上后面变量在结构体中的偏移,这样 “0 + 偏移”就求得了我们要求的值。感觉此代码非常巧妙,虽然不免有人说是愚弄编译器的伎俩,但是记下无妨,仍然觉得此法的甚妙。

  • 相关阅读:
    jvm调优
    Spring 事务
    Spring Framework入门介绍
    redis入门介绍
    Spring与SpringMVC重复扫描问题
    跨域相关问题
    Spring MVC介绍
    Servlet、Servlet容器
    获取屏幕宽高
    mybatis中比较符的写法
  • 原文地址:https://www.cnblogs.com/HappyAngel/p/1864856.html
Copyright © 2011-2022 走看看