【发布时间】:2010-08-13 14:51:00
【问题描述】:
我已经读过(在 C++ 对象模型中)C++ 中指向数据成员的指针的地址是数据成员的偏移量加 1?
我正在 VC++ 2005 上尝试这个,但我没有得到准确的偏移值。
例如:
Class X{
public:
int a;
int b;
int c;
}
void x(){
printf("Offsets of a=%d, b=%d, c=%d",&X::a,&X::b,&X::c);
}
应打印 a=1、b=5、c=9 的偏移量。但在 VC++ 2005 中,它变成了 a=0,b=4,c=8。
我无法理解这种行为。
书中摘录:
“然而,这种期望偏离了一个——有点传统的错误 适用于 C 和 C++ 程序员。
类内三个坐标成员的物理偏移量 如果 vptr 位于,则布局分别为 0、4 和 8 结尾或 4、8 和 12(如果 vptr 位于开头) 班级。但是,从获取成员地址返回的值, 总是增加 1。因此实际值为 1、5 和 9,并且 很快。问题是区分指向无数据的指针 成员和指向第一个数据成员的指针。举个例子:
float Point3d::*p1 = 0; float Point3d::*p2 = &Point3d::x; // oops: how to distinguish? if ( p1 == p2 ) { cout << " p1 & p2 contain the same value — "; cout << " they must address the same member!" << endl; }为了区分p1和p2,每个实际的成员偏移值是 增加了 1。因此,编译器(和用户)都必须记住 在实际使用该值来寻址成员之前减去 1。”
【问题讨论】:
-
pointer to data member in C++ is the offset of data member plus 1- 你从哪里得到这些信息的? -
看尺子,它也是从0开始的。
-
您引用的那段摘录缺少 CONTEXT .. 它在说什么?无论如何,您的示例代码结果完全正确,并且比文档更能说真话(这是编码的真理)。
-
书名是什么?把书扔掉。获取good one。
-
这本书貌似是《Inside the C++ Object model》,作者带领早期的cfront C++实现团队,自96年以来一直没有更新。像许多书籍一样,它可能更多是描述特定实现的历史好奇心,与今天的 C++ 无关。