[英]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
是一个运算符,而不是一个函数。 one
必须是这样,因而它的尺寸为1。 有关sizeof
运算符的有用参考; http://en.cppreference.com/w/cpp/language/sizeof
注:原题的变量是tow
不two
。
简单的答案是, one
和tow
是不同的类,大小不同。
tow
包含int,我假设你的编译器是4个字节。 我想你明白那一部分。
静态成员不存在于类的每个实例中,但它是在所有类之间共享的全局变量。 因此,它不包括在班级规模中。 这是因为sizeof
通常用于为对象分配内存,并且不需要为不在类实例中的变量分配内存。 这就是为什么one
不是4个字节。
它是1字节的原因是因为C ++标准不允许类具有0字节的大小,因此编译器已将其填充为非0大小。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.