2014-10-01 88 views
0

考虑一个名为A的C++类。哪些优点/缺点使用对象的数组:C++,对象数组VS指向这些对象的指针数组

std::array<A, 10> 

,而不是一个指针数组:

std::array<A*, 10> 
+6

你喜欢苹果还是橙子?这完全取决于你想要做什么。 – quantdev 2014-10-01 11:09:58

+0

他们完全不同。你怎么看? – ikh 2014-10-01 11:10:17

+0

如果你从Java到C++,我会建议你阅读关于指针的教程。这可能会澄清这样的问题。 – Skaarjasaurus 2014-10-01 11:16:17

回答

7

这里有重要的区别:

对象的数组:

  • 对象的内存由std::array管理。
  • 对象被存储在连续的存储器(良好的缓存效率)
  • 所有的对象都是相同类型的
  • 所有对象存在
  • 分配一个元件使得对象指针的

阵列的副本:

  • 指向的对象的内存不受包含指针的std::array的管理。
  • 可以指针存储到多态类型的一个共同的基础
  • 指针可以具有nullptr值即不指向任何对象
  • 分配的元件不会使被指向
所述对象的副本

这些东西中的任何一个是专业版还是骗局都取决于您的使用案例。

现在对于基于意见的部分,作为初学者的暗示:在我看来,内存由数组管理的事实表明数组“拥有”对象。通常不清楚谁拥有指针指向的对象。所有权的清晰度与高速缓存效率的结合始终是一种奖励,因此当您不确定时,这些对象阵列是一个很好的默认选择。如果可以,请在数组中使用对象,当需要时使用指针。当你需要指针时,考虑std::unique_ptr是否合适。

0

,如果你不希望使用STL阵列,您可以使用自己的阵列

1)数组[10]

2)A *阵列[10]

对于#1,类A必须具有默认构造函数。

A needs more memory to hold object 

    Whenever you assigned an object to any index of the array, copy constructor gets called 

    Compilation time required is more 

#2有没有必要构造

sizeof(array) = size of pointer * 10 

    compilation time required is less 

    There is no need of default constructor or copy constructor 
+0

请您解释一下,指针数组是如何减少编译时间的。此外,值得注意的是,如果您使用具有非默认构造函数参数的初始化程序列表(需要支持当前标准的编译器),则不需要默认构造函数。另外值得注意的是,数组和指向对象组合使用的总内存对于指针数组来说更高。 – user2079303 2014-10-02 07:37:32