c++ - 在类中存储指针或对象?

标签 c++ class object pointers move-semantics

只是一个设计/优化问题。什么时候存储指针或对象,为什么?例如,我相信这两种方法都有效(除非出现编译错误):

class A{
  std::unique_ptr<Object> object_ptr;
};

A::A():object_ptr(new Object()){}

class B{
  Object object;
};

B::B():object(Object()){}

我相信在堆栈或堆上实例化时会出现一个区别?

例如:

   int main(){
      std::unique_ptr<A> a_ptr;
      std::unique_ptr<B> b_ptr;
      a_ptr = new A(); //(*object_ptr) on heap, (*a_ptr) on heap?
      b_ptr = new B(); //(*object_ptr) on heap, object on heap?

      A a;   //a on stack, (*object_ptr) on heap?
      B b;   //b on stack, object on stack?
}

此外,sizeof(A) 应该是 <sizeof(B)? 还有其他我遗漏的问题吗? (Daniel 在评论中的相关帖子中提醒了我关于继承的问题)

因此,由于堆栈分配通常比堆分配快,但 A 的大小比 B 小,即使在有问题的情况下,即使有 move 语义,如果不测试性能就无法回答这些权衡之一吗?或者一些经验法则什么时候使用一个比另一个更有利? (San Jacinto 纠正了我有关堆栈/堆分配更快的问题,而不是堆栈/堆)

我猜想更多的拷贝构造会导致相同的性能问题(3 个拷贝将~ 3 倍类似的性能命中率与启动第一个实例)。但是move constructing可能还是尽量使用stack更有优势???

这是一个相关的问题,但不完全相同。 C++ STL: should I store entire objects, or pointers to objects?

谢谢!

最佳答案

如果你的 A class 中有一个大对象,那么我会存储一个指向它的指针,但对于小对象或原始类型,你不应该在大多数情况下,确实需要存储指针。

此外,当某些东西存储在堆栈或堆(自由存储)上时,实际上取决于实现,并且 A a 并不总是保证在堆栈上。

最好称它为自动对象,因为它的存储持续时间由声明它的函数的作用域决定。当函数返回时,a 将被摧毁。

指针需要使用 new 并且它确实会带来一些开销,但在今天的机器上,我认为在大多数情况下它是微不足道的,当然除非你已经开始 new处理数百万个对象,然后您将开始看到性能问题。

每种情况都不同,何时应该和不应该使用指针而不是自动对象,很大程度上取决于您的情况。

关于c++ - 在类中存储指针或对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7405658/

相关文章:

java - 关于函数中多个参数的设计问题

c++ - 用户定义类型的 vector

c++ - 类设计复杂化(C++)

java 。执行其他类中的一个类?

wordpress - 通过 register_widget 操作 Hook 将参数传递给 WP_Widget 构造

javascript - 理解 null 对象与 0 作为数字

c++ - 错误 : 'hash_map' is not a member of 'std'

c++ - 适用于 Mac 的 Excel SDK

java - java中如何关闭一个类

javascript - 如何将多个数组转换为多个对象的一个​​数组?