2011-02-11 87 views
6

我一直在阅读关于这个东西,对象的大小应该至少有1个字节(C++: What is the size of an object of an empty class?),并有两个空对象相同的地址有什么错?毕竟,我们可以有两个指向同一个对象的指针。为什么两个不同对象的地址应该不同?

谷歌搜索告诉我有关于对象身份fundemantal规则的东西,但我找不到更详细的信息。

所以... $ SUBJ。

+3

每当我看到像这样的问题时,我认为世界已经变得更好一个StackOverflow创建。 – sharptooth 2011-02-11 15:38:44

回答

5

在相同地址处有两个对象意味着当用指针引用它们时,将无法区分这两个对象。例如,在下面的代码:

EmptyClass o1; 
EmptyClass o2; 

EmptyClass * po = &o; 
po->foo(); 

应该foo的方法上o1o2称为?

有人可能会认为,由于这些对象没有数据并且没有虚拟方法(否则它们将具有非零大小),因此调用该方法的实例并不重要。

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! 

所以,是的,这一切都归结为对象标识:如果对象被允许是空的,他们可能被剥夺自己的身份,这是根本不允许的语言(谢天谢地)。

5

每个对象都必须占用不同的存储空间,否则无法取消分配一个对象而不释放与其共享存储的其他对象。

假设你有一个地址,两个不同的对象:

Type* object1 = new Type(); //first object 
Type* object2 = new Type(); //second object 

,他们碰巧是在同一地址,那么你

delete object1; 

会是怎样delete d,如果他们都具有相同的地址?

+3

这个逻辑不是很确定。如果我们允许在同一个地址上使用零大小的对象,那么为这样的对象声明`new`和`delete`为no-ops是合乎逻辑的,即`new`会返回一些任意地址(这是可以的,因为它无论如何都是不可忽略的),而“删除”将无所作为。 – AnT 2011-02-11 15:43:30

+0

@AndreyT - 从空项目继承的东西怎么样 – Flexo 2011-02-11 15:45:12

+0

我认为它不是重点。 operator new可以为每个分配的空对象返回预定义的0x1,并且delete可以对这样的地址不做任何操作 – 2011-02-11 16:02:35

1

当你有两个指向同一个对象的指针时,你可以使用其中的任何一个来操纵对象。结果=您可以访问该对象。

但是,如果你在同一地址有两个对象,你将如何区分它们在内存中?如果你有一个指向那个地址的指针,你怎么知道你的指针指向哪个对象?

因此,即使是空的,每个对象都需要不同的地址。

3

C++有(除其他外)一条规则,指向对象的指针比较等于当且仅当指针指向同一对象时。在你提出的情景下,这将不再是事实。

还有一些代码只是假设sizeof也会产生严格的正面结果。突出部分,例如,相当多的代码使用喜欢的东西:

#define elements(array) ((sizeof(array)/sizeof(array[0])) 

对于对象的大小为零,这将导致0/0,这在数学上是不确定的。

而不是在其他地方进行更改以支持一个角落案例,简单地消除角落案例以适应现有规则要简单得多。

0

尝试一个比喻。

如果您有两辆车,并且您尝试让它们占据相同的物理空间,您将会发生碰撞。

如果你有两个对象,并且你试图让它们占据相同的内存空间,那么你也会崩溃。

相关问题