我创建了一个类,但它的大小为零.现在,我怎样才能确定所有对象都有不同的地址?(我们知道,空类的大小不为零.)
#include<cstdio>
#include<iostream>
using namespace std;
class Test
{
int arr[0];//Why is the sizezero?
};
int main()
{
Test a,b;
cout <<"size of class"<<sizeof(a)<<endl;
if (&a == &b)// now how we ensure about address of objects ?
cout << "impossible " << endl;
else
cout << "Fine " << endl;//Why isn't the address the same?
return 0;
}
Run Code Online (Sandbox Code Playgroud)
你的班级定义是非法的.C++不允许0在任何上下文中使用大小的数组声明.但即使您使类定义完全为空,sizeof仍然需要将其计算为非零值.
9/4类类型的完整对象和成员子对象应具有非零大小.
换句话说,如果您的编译器接受类定义并将上面sizeof的值计算为零,那么该编译器将超出标准C++语言的范围.它必须是与标准C++无关的编译器扩展.
因此,在这种情况下,"为什么"问题的唯一答案是:因为这是在编译器中实现的方式.
我不知道它与确保不同对象具有不同地址有什么关系.无论对象大小是否为零,编译器都可以轻松地强制执行此操作.
该标准表示具有零大小的数组会导致未定义的行为.当您触发未定义的行为时,标准提供的其他保证(例如要求对象位于不同的地址)可能不成立.
不要创建零大小的数组,并且不应该有这个问题.