为什么对象的大小为零
Why the size of the object is zero
我得到对象的大小为零,这是不应该的。请解释一下为什么编译器给出这个答案的概念?
#include<iostream>
using namespace std;
class xxx{
public: int a[]; // Why this line is not giving error.
};
int main(int argc, char *argv[])
{
xxx x1;
cout<<sizeof(x1); //Q=Why this code is not giving error.
return 0;
}
正如其他人所说,C++中的对象永远不能有 0 的大小。
但是,由于代码首先C++无效(数组不能为空),因此这无关紧要。编译器只是做它想做的事。
带有-pedantic
的 GCC 拒绝此代码。MSVC 至少警告说。我的clang++
版本包含-pedantic
ICE,但在此之前确实会发出警告。
您没有使用符合标准的编译器。对象大小不能0
,即使是空的class
或struct
也有大小1
。此外,必须指定数组维度。
编辑:这很奇怪,ideone也打印出0。在 MSVS 中,我收到警告,但至少大小为 1。
5.3.3. 大小
- [...]当应用于类时,结果是该类的对象中的字节数 [...]最派生类的大小应 大于零。[...]将 sizeof 应用于基类子对象的结果是基类类型的大小。[...]
编辑2:
我在 MSVS 中尝试了以下内容:
xxx a[100];
并且无法编译。奇怪的是它如何没有事先发现错误。
类
xxx
中a
的元素称为灵活数组成员。
灵活的阵列成员不在C++标准中。它们是C99的一部分。但是,许多编译器供应商提供灵活的数组成员作为C++扩展。
您的代码按原样不是合法的 C 代码。它使用C++特定的构造。你的代码很容易改成C.改class
struct
,去掉public
,把C++I/O的使用改成C的printf
。通过这些更改,转换后的代码仍然是非法的 C99 代码。灵活数组成员仅允许作为结构的最后一个元素,否则该元素为非空。
显然,您的供应商将灵活阵列成员概念带到了C++,但没有将结构非空的约束。
对象的大小不能为零。 即使类为空,其大小也永远不会为零。
查看链接以了解更多Bjarne Stroustrup的C++风格和技术常见问题解答。
相关文章:
- 如何为对象生成滚动效果?
- 为对象分配整数.输出将是什么?
- 如何动态地为对象中的数据赋值?
- 有没有办法在同名类 (c++) 中为对象分配一个指针变量
- 如何创建和使用存储为 c++ 对象的 python 对象?
- 当表示为对象的一维向量时,有效地旋转 NxM 矩阵 (C++)
- 将字节数组转换为对象C++ |C++中的 C# 位转换器
- 我们可以在cpp中为对象分配函数吗
- 如何定义此"if block"中其他无效输入的值,以便在c ++中将字符串转换为对象?
- 如何在 gdb 中的所有构造函数上同时为 C++ 对象设置断点?
- 错误:为什么"void*"不是指向对象的指针类型,即使指针设置为对象?
- 如何将 cv::mat 对象从 python 模块传递到 c++ 函数并返回返回的 cv::mat 类型为对象?
- 如何在 c c ++ 混合生成文件中为 c 对象添加附加规则?
- 如何将任何值转换为对象并使用 boost::p roperty_tree json 添加成员
- 如何将 QML 中的引用错误解析为 c++ 对象
- 将 OpenCV 帧另存为对象
- qt vsaddin错误对象引用未设置为对象的istanse
- 为对象的成员提供别名
- C++ 如何将结构化 git 日志的输出解析为对象
- 如何为对象提供不同的接口(最佳)