这个班的人数是多少?为什么
What is the size of this class and Why?
我有两个类,如下
class A
{
};
class B
{
int a[];
};
int main()
{
cout << sizeof(A) <<endl; //outputs 1
cout << sizeof(B) <<endl; //outputs 0
return 0;
}
我很熟悉空类的大小是1,但为什么B类的大小会变成零??
GCC允许将零长度数组作为扩展:http://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html
和:
作为零长度数组的原始实现的一个怪癖,sizeof的计算结果为零。
就C++语言而言,您的代码格式不正确。特别地,类B
不应该在C++标准一致性编译器中编译。您的编译器要么有错误,要么将此功能作为扩展提供。
带有-pedantic-errors -std=c++11
的GCC给出以下错误:
cpp.cpp:18:11: error: ISO C++ forbids zero-size array 'a' [-Wpedantic]
int a[];
^
空类的大小不是1。在C++系统中,它至少是1。原因是,例如,您需要能够分配一个具有new
的实例,并有一个指向它的非空指针
相反,第二种情况只是无效的C++。
编译器制造商通常会通过默认情况下允许非标准的"扩展"来获得一些自由,并试图让你无意识地使用它们(偏执狂会说,通过让你的代码无法被其他编译器移植来锁定你)。
相关文章:
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- 为什么在全局范围内使用"extern int a"似乎不行?
- 为什么在popback()操作之后,它仍然打印完整的矢量
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 为什么会发生堆损坏
- 为什么使用 "this" 指针调用派生成员函数?
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 为什么比较运算符如此快速
- 为什么 Serial.println(<char[]>);返回随机字符?
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 为什么不;名字在地图上是按顺序排列的吗
- 我的字符计数代码计算错误.为什么
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- 为什么野牛仍在使用"int yylex(void)",却找不到"int yylex(YYS
- 为什么C++虚拟调用并不比非虚拟调用慢多少
- 为什么在这种情况下STL priority_queue并不比multiset快多少
- 这个班的人数是多少?为什么