首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

问一个初学者的有关问题

2013-02-24 
问一个菜鸟的问题;class A{}int _tmain(int argc, _TCHAR* argv[]){int a sizeof(A)return 0}为什么

问一个菜鸟的问题;

class A{};
int _tmain(int argc, _TCHAR* argv[])
{
    int a = sizeof(A);
return 0;
}

为什么一个空类的sizeof不等于0?内存里面做了些神马?
[解决办法]
空类的默认大小是1,因为要保证正确的定义对象,如果空类的大小是0,那么A a;这个语句就会出错,对象既要存在,但是又没有占用存储大小就矛盾了,所以各个编译器就干脆把空类的大小定义为1的字节,这样就不会出现上述问题了。
[解决办法]
++
引用:
空类的默认大小是1,因为要保证正确的定义对象,如果空类的大小是0,那么A a;这个语句就会出错,对象既要存在,但是又没有占用存储大小就矛盾了,所以各个编译器就干脆把空类的大小定义为1的字节,这样就不会出现上述问题了。

[解决办法]
标准只要求空类的大小不能为零,不过一般编译器都设成1.

C++用不同地址来区别不同对象,如果空类大小为零,就会出现不同对象的地址相同。

A a1, a2;
if (&a1 == &a2) //- 按标准,这个条件不应该成立

还有一个很好记的解释,假如定义了一个数组 A a[10],C++中可以用sizeof(a)/sizeof(A)来求数组大小,如果sizeof(A)=0,这个用法就会出问题。

但是,有一点很奇怪,零数组的大小确实为0,这样看起来不是空类,对象大小却为0!
class B {
  char m[0];
};
typedef int C[0];

这时sizeof(B)与sizeof(C)都是0.也许是因为这个缘故,C++标准不允许定义零数组,但是GCC中只给出警告,而不认为是个错误,后果自负。
[解决办法]
引用:
空类的默认大小是1,因为要保证正确的定义对象,如果空类的大小是0,那么A a;这个语句就会出错,对象既要存在,但是又没有占用存储大小就矛盾了,所以各个编译器就干脆把空类的大小定义为1的字节,这样就不会出现上述问题了。

++

热点排行