成员变量的C ++偏移量?

时间:2010-03-12 06:38:51

标签: c++

我有:

class Foo {
  int a;
  int b;
  std::string s;
  char d;
};

现在,我想知道给定Foo *

的a,b,s,d的偏移量

即。假设我有:

Foo *foo = new Foo();
(char*) foo->b == (char*) foo + ?? ; // what expression should I put in ?

2 个答案:

答案 0 :(得分:7)

我不确切地知道为什么你想要一个成员偏移到你的struct,但偏移量是允许在给定结构地址的情况下获得指向成员的指针。 (请注意,标准offsetof宏仅适用于POD结构(不属于您),因此这里的答案不合适。)

如果这是你想要做的,我会建议使用指向成员的指针,因为这是一种更便携的技术。 e.g。

int main()
{
    int Foo::* pm = &Foo::b;

    // Pointer to Foo somewhere else in the program
    extern Foo* f;

    int* p = &(f->*pm);
}

请注意,这仅在bFoo不是私有的情况下才有效,或者您可以在成员函数或Foo的朋友中形成指向成员的指针。

答案 1 :(得分:1)

您应该考虑结构内部的偏移量是编译器相关的。不同的编译器不仅可以在结构的末尾添加填充零或不填充,甚至在结构的中间(尽管我认识到这种情况更为罕见)。即,直接使用偏移量而不是以“标准方式”访问成员的结果是未定义的行为。

Charles Balley给出的解决方案更明智。无论如何,我不太明白你的问题的最终目标是什么。具体地,

Foo *foo = new Foo();
(char*) foo->b == (char*) foo + ?? ;

对我来说根本没有意义。你想在foo中分配foo-> b;它自己的偏移吗?

也许你要做的是在foo中使用b作为char *,在这种情况下问题是:

Foo *foo = new Foo();
char* ptr == (char*) foo + ?? ;

也许你有时想把b当作int,有时候把它当作char *,在这种情况下,你可以尝试进行以下更改(假设你只是忘了公开):

class Foo {
public:
    int a;
    union b {
        int intB;
        char * chrB;
    }
    int c;
    // ...
};