请问如何准确地知道某个类成员变量相对于this的偏移地址?

menzi11 2011-11-22 10:30:43
请问如何准确地知道某个类成员变量相对于this的偏移地址?
譬如说:

class B{};


class A
{
public:
。。。。。。。。。。
private:
int x;
B z;
bool y;
各种可能出现的类型 XXXXX;
};


那么现在有一个指向A某个实例的指针,或者是在实例内部的this指针,
如何使用例如 “*(this+?)”的形式访问到某个变量xyz.....
谢谢!
...全文
170 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
天限天空 2012-02-22
  • 打赏
  • 举报
回复
试一试这个
class A
{
public:
int m_iTest;
int &m_iB;
}

offsetof(A,m_iB)
yisikaipu 2011-11-24
  • 打赏
  • 举报
回复
确实很局限,只能是对付public成员,但细看楼主贴里有private……
机智的呆呆 2011-11-24
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 menzi11 的回复:]
引用 4 楼 zaffix 的回复:

如果想了解内存布局可以在调试时观察,但代码里绝对不能写这个的代码,不同编译器不同平台实现都不同的。

虽然每个编译器对成员变量的地址
分配地不一样,但是编译之后肯定是一个定值,当然如果是:

class A {
int a;
int b;
}
A.b : this+4 //这样肯定是不行。。。



3楼的靠谱!! 刚查了一下o……
[/Quote]
offsetof(type,field)中的type必须是一个POD的结构体或union,所以使用非常有局限。
况且this+offset(type,field)实质上就是this.field,那为何不用后者哪?
非常同意2楼观点。
机智的呆呆 2011-11-24
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 menzi11 的回复:]
引用 4 楼 zaffix 的回复:

如果想了解内存布局可以在调试时观察,但代码里绝对不能写这个的代码,不同编译器不同平台实现都不同的。

虽然每个编译器对成员变量的地址
分配地不一样,但是编译之后肯定是一个定值,当然如果是:

class A {
int a;
int b;
}
A.b : this+4 //这样肯定是不行。。。



3楼的靠谱!! 刚查了一下o……
[/Quote]
offsetof(type,field)中的type必须是一个POD的结构体或union,所以使用非常有局限。
况且this+offset(type,field)实质上就是this.field,那为何不用后者哪?
非常同意2楼观点。
机智的呆呆 2011-11-24
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 menzi11 的回复:]
引用 4 楼 zaffix 的回复:

如果想了解内存布局可以在调试时观察,但代码里绝对不能写这个的代码,不同编译器不同平台实现都不同的。

虽然每个编译器对成员变量的地址
分配地不一样,但是编译之后肯定是一个定值,当然如果是:

class A {
int a;
int b;
}
A.b : this+4 //这样肯定是不行。。。



3楼的靠谱!! 刚查了一下o……
[/Quote]
offsetof(type,field)中的type必须是一个POD的结构体或union,所以使用非常有局限。
况且this+offset(type,field)实质上就是this.field,那为何不用后者哪?
非常同意2楼观点。
menzi11 2011-11-23
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 zaffix 的回复:]

如果想了解内存布局可以在调试时观察,但代码里绝对不能写这个的代码,不同编译器不同平台实现都不同的。
[/Quote]
虽然每个编译器对成员变量的地址
分配地不一样,但是编译之后肯定是一个定值,当然如果是:

class A {
int a;
int b;
}
A.b : this+4 //这样肯定是不行。。。



3楼的靠谱!! 刚查了一下offsetof是C++标准定义的宏,我说我一直奇怪有sizeof怎么会没有
offsetof...看来是这货没跑了~~谢谢了! 也谢谢诸位!
yisikaipu 2011-11-22
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 pathuang68 的回复:]某些简单的类还是可以做到的(比如不是虚继承)[/Quote]

再复杂也可以做到

正解就在#3楼啊
offsetof(s,m)
pathuang68 2011-11-22
  • 打赏
  • 举报
回复
某些简单的类还是可以做到的(比如不是虚继承),参考下面的例子:

#include <iostream>
using namespace std;


class A
{
public:
void printInfo()
{
cout << a1 << '\t' << a2 << '\t' << a3 << '\t' << endl;
}
private:
int a1;
int a2;
double a3;
};

class B
{
public:
void printInfo()
{
cout << b1 << '\t' << b2 << '\t' << b3 << '\t' << endl;
a.printInfo();
}
private:
int b1;
int b2;
float b3;
A a;
};

int main(void)
{
B b;
*((int*)&b) = 1;
*((int*)&b + 1) = 2;
*(float*)((int*)&b + 2) = 3.3f;

*((int*)((A*)((int*)&b + 4))) = 4;
*((int*)((A*)((int*)&b + 5))) = 5;
*((double*)((A*)((int*)&b + 6))) = 6.6;

b.printInfo();

return 0;
}


可以正确地对私有成员变量进行存取(在VS2010上)。

需要特别注意的是,不同的编译器可能会有不同的结果,因为至少有可能对齐方式不同的。
youkuxiaobin 2011-11-22
  • 打赏
  • 举报
回复
我也想知道,反汇编试下吧
zaffix 2011-11-22
  • 打赏
  • 举报
回复
如果想了解内存布局可以在调试时观察,但代码里绝对不能写这个的代码,不同编译器不同平台实现都不同的。
  • 打赏
  • 举报
回复
size_t offsetof(
structName,
memberName
);
taodm 2011-11-22
  • 打赏
  • 举报
回复
楼主,绝对不要用这种hacker式编程,会自己把自己坑了的。
机智的呆呆 2011-11-22
  • 打赏
  • 举报
回复
以目前c++标准不能准确地知道某个类成员变量相对于this的偏移地址,以后估计也不能

64,643

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧