我一直在读这个东西,一个对象的大小至少应该是1个字节(C++: What is the size of an object of an empty class?),并且有两个空对象是同一个地址有什么不对?毕竟,我们可以有两个指向同一个对象的指针。
谷歌搜索告诉我有一些关于对象身份fundemantal规则,但我找不到更详细的信息。
所以... $ SUBJ。
答案 0 :(得分:6)
在同一地址处有两个对象意味着在使用指针引用它们时无法区分这两个对象。例如,在以下代码中:
EmptyClass o1;
EmptyClass o2;
EmptyClass * po = &o;
po->foo();
是否应在o1
或o2
上调用foo方法?
可以说,由于这些对象没有数据而且没有虚拟方法(否则它们的大小非为零),调用该方法的实例并不重要。但是,当我们想测试两个对象是否相等时(即它们是否相同),这变得更加重要:
template < typename T >
bool isSame( T const & t1, T const & t2 )
{
return &t1 == &t2;
}
EmptyClass o1; // one object and...
EmptyClass o2; // ...a distinct object...
assert( ! isSame( o1, o2 ) ); // ...should not be one and same object!
对于一个更具体的例子,让我们假设我想将一些对象(我可以说实体)与一些值相关联,比如说在一个关联容器中:
Person you;
Person me;
// You and I are two different persons
// (unless I have some dissociative identity disorder!)
// Person is a class with entity semantics (there is only one 'me', I can't make
// a copy of myself like I would do with integers or strings)
std::map< Person *, std::string > personToName;
personToName[&you] = "Andrew_Lvov";
personToName[&me] = "Luc Touraille";
// Oh, bother! The program confused us to be the same person, so now you and I
// have the same name!
所以是的,这一切都归结为对象身份:如果允许对象为空,则可能会剥夺他们的身份,这是语言所不允许的(谢天谢地)。
答案 1 :(得分:5)
每个对象必须占用不同的存储空间,否则在不释放与其共享存储空间的其他对象的情况下,您无法取消分配一个对象。
假设您在一个地址有两个不同的对象:
Type* object1 = new Type(); //first object
Type* object2 = new Type(); //second object
他们碰巧在同一地址,然后你
delete object1;
如果他们都有相同的地址,那么delete
d会是什么?
答案 2 :(得分:3)
C ++有(除其他外)一条规则,当指针指向同一个对象时,指向对象的指针比较相等。根据你提出的情况,这将不再适用。
还有相当多的代码假设sizeof
也会产生严格的正面结果。例如,Jut,相当多的代码使用的东西如下:
#define elements(array) ((sizeof(array)/sizeof(array[0]))
对于大小为零的对象,这将导致0/0
,这在数学上是未定义的。
除了在其他地方进行更改以支持一个角落的情况之外,简单地消除角落情况以使其符合现有规则要简单得多。
答案 3 :(得分:1)
如果有两个指向同一对象的指针,则可以使用其中一个来操纵对象。 Result =您可以访问该对象。
但是,如果您在同一地址有两个对象,那么您如何在内存中区分它们?如果你有一个指向该地址的指针,你怎么知道你的指针指向哪个对象?
因此,每个对象需要不同的地址,即使它们是空的。
答案 4 :(得分:0)
尝试类比。
如果你有两辆车,而你试图让它们占据相同的物理空间,你就会崩溃。
如果您有两个对象,并且尝试让它们占用相同的内存空间,那么您也会崩溃。