C++如何获取类成员的偏移
2016-12-28 14:50
204 查看
如何获取类成员变量的移植,网上有个方法:
&((A*)0)的地址是0,所以&((A*)0)->i的地址为&((A*)0)->i减去0,即成员变量的地址。
之所以可以这样,是因为没有内存的分配读写,这段代码的计算在编译时就完成,只要编译不出错就可以。
最近查看Android的art runtime代码,发现有类似的宏定义:
为什么要用16呢?因为如果用0,lint会提示错误。
为什么不用1或其它?因为有类/结构体对齐问题。
struct A { int i; }; &((A*)0)->i;原理如下:
&((A*)0)的地址是0,所以&((A*)0)->i的地址为&((A*)0)->i减去0,即成员变量的地址。
之所以可以这样,是因为没有内存的分配读写,这段代码的计算在编译时就完成,只要编译不出错就可以。
最近查看Android的art runtime代码,发现有类似的宏定义:
#define OFFSETOF_MEMBER(t, f) \ (reinterpret_cast<uintptr_t>(&reinterpret_cast<t*>(16)->f) - static_cast<uintptr_t>(16u)) // NOLINT实际上就是上面的方法,把0换成了16
为什么要用16呢?因为如果用0,lint会提示错误。
为什么不用1或其它?因为有类/结构体对齐问题。
相关文章推荐
- C++中如何获取类成员的指针
- c++::获取结构体中某 个成员相对结构体起始位置的偏移
- C/C++笔试系列--如何利用成员变量作为成员函数的默认参数
- c++ 如何给类的非静态常量或引用成员赋值
- 获取结构体某成员偏移
- c++ 如何获取系统时间
- c++ 如何获取系统时间
- c++ 如何获取系统时间
- c++ 如何获取系统时间
- 如何获取目录下所有文件名 c++
- [C++] 如何初始化常量数组成员
- C/C++中如何获取数组的长度?
- How to get the file's icon using C++ - 用C++如何获取文件的图标
- How to get random string using C++ - 用 C++ 如何获取随机字符串
- [C/C++]如何防止Edit框中的密码不被非法获取
- 如何通过结构中的某个成员地址获取结构本身的指针???
- C++如何获取当前时间并转换成相应的格式字符串.
- How to get cpu's physical ID in C++ - 在C++中如何获取CPU物理ID
- How to get random number within a range using C++ - 如何用C++获取一定范围内的随机数
- C++中如何获取对象的名字(变量名,注意不是类名)