首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >成员变量的C++偏移量?

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

Stack Overflow用户
提问于 2010-03-12 14:38:51
回答 2查看 6.2K关注 0票数 2

我有:

代码语言:javascript
复制
class Foo {
  int a;
  int b;
  std::string s;
  char d;
};

现在,我想知道给定Foo*时a,b,s,d的偏移量

例如,假设我有:

代码语言:javascript
复制
Foo *foo = new Foo();
(char*) foo->b == (char*) foo + ?? ; // what expression should I put in ?
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-03-12 16:04:36

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

如果这就是你想要做的,我建议使用指向成员的指针,因为这是一种更可移植的技术。例如:

代码语言:javascript
复制
int main()
{
    int Foo::* pm = &Foo::b;

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

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

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

票数 8
EN

Stack Overflow用户

发布于 2010-03-12 18:04:30

您应该考虑到结构内部的偏移量是依赖于编译器的。不同的编译器可以填充零,或者不只是在结构的末尾,甚至在结构的中间(尽管我知道这种情况比较少见)。也就是说,直接处理偏移量而不是以“标准方式”访问成员的结果是未定义的行为。

查尔斯·巴利给出的解决方案更明智一些。无论如何,我不太明白你的问题的最终目的是什么。具体来说,

代码语言:javascript
复制
Foo *foo = new Foo();
(char*) foo->b == (char*) foo + ?? ;

对我来说一点意义都没有。你想在Foo中给foo->b分配自己的偏移量吗?

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

代码语言:javascript
复制
Foo *foo = new Foo();
char* ptr == (char*) foo + ?? ;

也许你有时想把b当做int,有时把b当做char *,在这种情况下,你可以试着做以下改变(假设你只是忘了放入public):

代码语言:javascript
复制
class Foo {
public:
    int a;
    union b {
        int intB;
        char * chrB;
    }
    int c;
    // ...
};
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2430954

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档