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