为什么空数组的大小为 0,而空类的大小不是 0
Why size of an empty array is 0 but size of an empty class is not 0?
例如:
int main() {
struct {} foo;
int bar[0];
struct {
int dummy[0];
} baz;
cout << sizeof(foo) << endl; //display '1'
cout << sizeof(bar) << endl; //display '0'
cout << sizeof(baz) << endl; //display '0'
return 0;
}
请告诉我有什么理由支持编译器行为
这是一个
C++唯一的问题。在 C 语言中,编译器禁止空struct
。
在C++中,sizeof(foo) == 1
的原因最终是为了可以强制执行C++标准的规则"任何对象在内存中都不得具有与任何其他变量相同的地址"。您可以在此处阅读详细信息。
编辑:关于user2864740
关于baz
的评论,它也应该是非零的是正确的。编译器允许空数组,这使得精细规则似乎没有像应用于foo
那样一致地应用于baz
。事实上,这确实弄乱了指针算法。请参阅此示例:
// C++14 code
#include <iostream>
using namespace std;
int main() {
struct baz {
int dummy[1];
};
cout << sizeof(baz) << endl;
baz* arr;
arr = new baz[5];
cout << &arr[0] << endl;
cout << &arr[1] << endl;
return 0;
}
// everything looks good
4
0x892c008
0x892c00c
但是如果我们使用相同的代码并将 baz
中的数组更改为 int dummy[0];
,那么我们得到以下输出:
0
0x8fe3008
0x8fe3008
确实很危险;这可能导致无限循环。建议你不要像这样淘气,即使你已经找到了逃脱的方法:)
编辑:假设 g++
sizeof
返回对象的大小(以字节为单位 http://en.cppreference.com/w/cpp/language/sizeof
空数组的大小为 0,因为其中没有字节。结构的大小,一般不为零。如果编译器确定结构为空,则它将报告零。
在您的情况下,编译器可以判断结构中的字节数为零。因此,sizeof(bar)
和 sizeof(baz)
为零
另请参阅此处 http://www.gnu.org/software/gnu-c-manual/gnu-c-manual.html#The-sizeof-Operator
相关文章:
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- 芬威克树(BIT).找到具有给定累积频率的最小索引,单位为 O(logN)
- 为什么在浮点中从大到小会引入更多的误差
- 为什么这个函数将"const char*"转换为"void* const"而不是"const void*"
- 为什么文件名被设置为一个点,而不是在读取矢量中的文件名时
- 为什么C++逐位AND运算符在不同大小的操作数中表现为这样
- 为什么在逗号分隔符上下文中将预增量的结果强制转换为void
- 你好。。。id_public变量不应该给出结果为 81 和 86 吗?为什么它为两个派生类占用不同的内存位置?
- 为什么我们要为avl树实现返回一个指向节点的指针,而不是void函数
- <Windows>为什么 std::thread::native_handle 返回类型为"long long unsigned int"的值,而不是 void*(又名 HANDLE)?
- 为什么 gcc 和 clang 为函数模板的实例化生成不同的符号名称?
- 为什么Arduino(小端序)上的Sha1在没有转换为大端序的情况下工作?
- 为什么 std::ssize 被强制为其有符号大小类型的最小大小
- 为什么在将小部件设置为中央时不显示场景
- 搜索一组点,其长度总和最小为矩形.算法是什么
- 为什么渲染引擎将图像细分为小方块
- 为什么我的c++算法总是为一个数字的最小值和最大值返回相同的值
- 将参数从主线程传递到线程.当线程退出时,主线程将重置为0.为什么?
- 最小最大值算法:为什么要使评级为负
- Codechef:从数组元素中移除成对的公共因子,并找到最小乘积.为什么回答错误