【问题标题】:Class and structure data placement C/C++ [duplicate]类和结构数据放置 C/C++ [重复]
【发布时间】:2015-09-15 17:40:27
【问题描述】:

据我所知,class和struct数据是一个接一个地放置的,例如:

class Foo
{
    int A;
    char B;
    float* C;
    double* D;
};

Foo Object;
char* ptr = &Object;

&(Object.A) == ptr;    // all these are true
&(Object.B) == ptr+sizeof(int);
&(Object.C) == ptr+sizeof(int)+sizeof(char);
&(Object.D) == ptr+sizeof(int)+sizeof(char)+sizeof(float*);

总是这样吗?如果我在类中将所有这些数据都设为静态,它是否也有效?

【问题讨论】:

  • void *?? 上的指针运算嗯...
  • “总是这样吗?” 没有
  • 非常感谢。这就是我想知道这是某种标准还是只是偶尔发生。
  • 请去掉C标签,因为class不是C语言的关键字。
  • 有一个很好的标准:您的平台/架构的 ABI 和/或 PCS。

标签: c++ class struct


【解决方案1】:

嗯,尽管所有这些都是正确的,但这些 cmets 有点误导。 (也许因为这其实是一个duplicate of an old question

您最初的假设是“基本上”正确的。好吧,基本上

您唯一可以(至少大部分时间)依赖的是元素的顺序

元素的实际大小因平台和编译器而异。这本身就是一个问题,但 int 大部分时间是 32 位,但有时是 16 位甚至 64 位。

除此之外,编译器可能(也可能不会)在元素之间添加一些填充,有时取决于元素类型,有时不。

总结:如果您编写的代码像您提议的那样依赖于指针算法,那么您的代码将平台相关实现/编译器相关

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-15
    • 1970-01-01
    • 1970-01-01
    • 2010-10-07
    • 1970-01-01
    • 2012-02-05
    • 2021-12-23
    相关资源
    最近更新 更多