【问题标题】:Can anyone explain to me why the sizeof function returns different values in below code?谁能向我解释为什么 sizeof 函数在下面的代码中返回不同的值?
【发布时间】:2014-07-21 12:59:30
【问题描述】:

谁能解释一下为什么sizeof 函数在下面的代码中返回不同的值?

//static member
class one
{
  public :
  static const int a = 10;
};
//non static member
class two
{
  public :
  int a;
};
int main()
{
  cout << sizeof(one);       //print 1 to lcd
  cout << sizeof(two);       //print 4 to lcd,differ from size of one class
}

【问题讨论】:

  • 静态成员每个类存在一次(并且不属于任何实例),非静态成员每个实例存在一次。因此,类型 1 的对象不包含名称为 a 的字段,类型 2 的对象包含。

标签: c++ static constants


【解决方案1】:

首先你应该知道sizeof不是一个函数,它是一个运算符,就像+||一样。

那么关于你的问题。静态成员变量实际上并不像非静态成员变量那样类中,因此只有静态成员的类的大小为零。但同时所有对象都需要是可寻址的,因此必须具有,这就是为什么sizeof 给你1 作为第一类。

【讨论】:

  • 我建议也提到空基优化。
【解决方案2】:

one 没有非静态成员,所以它的一个实例是空的。静态成员不包含在该类型的任何对象中,而是独立于任何对象存在。它的大小为 1,而不是零,因为 C++ 不允许类型大小为零(以确保不同的对象具有不同的地址)。

two 确实有一个非静态成员,因此实例必须足够大以包含该成员。在您的情况下,它的大小是 4,与其 int 成员的大小相同。

【讨论】:

    【解决方案3】:

    静态数据成员不存储在类本身中,因此不会对类sizeof 产生影响。我们可以通过 C++ 标准草案第 9.4.2 节静态数据成员看到这一点:

    静态数据成员不是类的子对象的一部分。

    one 类的大小为 1,因为完整的对象应具有非零大小,来自 9 Classes 部分的内容:

    类类型的完整对象和成员子对象应具有非零大小。106

    请注意,sizeof 是运算符而不是函数。

    【讨论】:

    • 投了赞成票,尽管您的第一句话和引文几乎相同,这听起来有点滑稽。
    • 更多的支持。现在它对初学者也更友好了:)
    【解决方案4】:

    简单的答案是onetow 是不同大小的不同类。

    tow 包含 int,我假设在您的编译器上是 4 个字节。我想你理解那部分。

    静态成员并不存在于类的每个实例中,但它是所有类之间共享的全局变量。因此,它不包括在班级规模中。这是因为sizeof 通常用于为对象分配内存,不需要为不在类实例中的变量分配内存。这就是one 不是 4 个字节的原因。

    之所以为 1 字节,是因为 C++ 标准不允许类的大小为 0 字节,因此编译器将其填充为非 0 大小。

    【讨论】:

      【解决方案5】:

      one 中,静态变量a 在计算类/对象的大小时不会被考虑。

      two 中,将考虑a,在这种情况下等同于sizeof(int)

      注意事项:

      • sizeof 是运算符,而不是函数。
      • 类的大小可能不为 0,因此,one 的大小必须是某个值,因此它的大小为 1。

      sizeof 运算符的有用参考; http://en.cppreference.com/w/cpp/language/sizeof

      注意:原始问题变量是tow 而不是two

      【讨论】:

        猜你喜欢
        • 2013-10-22
        • 2018-11-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-11
        相关资源
        最近更新 更多