读书人

class x;class xy public x;xy test

发布时间: 2013-01-08 14:02:13 作者: rapoo

class x;class xy public x;xy test;问sizeof(test)是多少?


#include<iostream>
using namespace std;

class x
{
public:
static int count;
int number;
private:
char X;
};

class xy:public x
{
private:
char Y;
public:
static int type;
};


int main()
{
xy test;
cout<<sizeof(test)<<endl;
return 0;
}

输出结果是12,我怎么都想不通。。我认为是16呢,求教各位原因!
[解决办法]
对象布局+内存对齐,都要考虑。

[解决办法]
引用:
说的具体点。。只知道内存对齐,没听过对象布局。。引用:
对象布局+内存对齐,都要考虑。


static声明的变量内存布局和类中的其他变量不在一起,它被存贮在静态区,所以sizeof(x)的大小是8,同理sizeof(xy)的大小是12,这个过程做了2次char类型的内存对齐。
[解决办法]
由于static变量是保存在类存储空间的而不是对象空间,所以说不要计算任何static的变量。
另外对齐就是和最大的字节对齐,比如,一个int,一个char,char虽然占一个字节,但是在保存的时候和int对齐,也会分配四个字节。

不信的话你sizeof(一个x类型的对象)肯定是8,而不是12

实际上你sizeof(test)其实就是
int number;
char X;
char Y;
这三个变量的空间。刚好12个字节
[解决办法]
说白了你系统为class xy 事先开辟的空间就是:
int number;
char X;
char Y;
按照内存4字节对齐:sizeof(test) = 12 没错啊
[解决办法]
引用:
说白了你系统为class xy 事先开辟的空间就是:
int number;
char X;
char Y;
按照内存4字节对齐:sizeof(test) = 12 没错啊

估计还和继承有关,单纯只是这样子的话size应该是8。可能是因为size(x)就已经是8了,继承后就另外放了4个字节。但是我觉得这种研究毫无意义,自动对齐的细节是编译器决定的。

读书人网 >C++

热点推荐