繁体   English   中英

任何人都可以向我解释为什么sizeof函数在下面的代码中返回不同的值?

[英]Can anyone explain to me why the sizeof function returns different values in below code?

任何人都可以解释为什么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
}

你应该学习的第一件事是sizeof不是一个函数,它是一个像+||的运算符

至于你的问题。 静态成员变量实际上不是课堂以同样的方式非静态成员变量,所以只有静态成员类将有大小为零。 但同时所有对象都需要可寻址,因此具有,这就是sizeof为第一堂课提供1原因。

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

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

静态数据成员不存储在类本身中,因此不会对类的sizeof有所贡献。 我们可以通过转到草案C ++标准部分9.4.2静态数据成员来看到这一点:

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

one的大小为1 ,因为完整的对象应具有非零大小,从段9 ,其表示:

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

注意, sizeof是一个操作符而不是一个函数。

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

two中, a将被认为是,在这种情况下,等同于sizeof(int)

笔记:

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

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

注:原题的变量是towtwo

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

tow包含int,我假设你的编译器是4个字节。 我想你明白那一部分。

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

它是1字节的原因是因为C ++标准不允许类具有0字节的大小,因此编译器已将其填充为非0大小。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM