【发布时间】:2014-06-15 21:55:07
【问题描述】:
这是一段复杂的代码,所以很抱歉没有提供代码 sn-ps。在我的代码中,我在堆上创建了一个对象,如下所示:
{
State *s = new State();
...
#pragma omp parallel for
for(int i =0; i < n(blah); ++i) foo(s);
...
delete s;
}
s 仅被创建一次,但多次传递给函数foo(s)
在函数foo我有
void foo(State *s) {
State tmp = *s; // Does this create a copy on the stack ?
....
}
我当然可以避免像这样创建tmp,我的动机完全是出于审美(即避免每次都输入s->bla())。
State tmp = *s 在缓存和别名方面的优缺点是什么?
我在使用g++-4.6 -pg 进行分析时观察到的是,有多次调用State 的析构函数,尽管我主要只创建了一次。
所以我的问题是:取消引用为State tmp = *s; 在堆栈上创建一个副本并在每次范围结束时调用析构函数。
我的预感是赋值运算符被调用以在堆栈上创建对象的副本,然后被销毁。如果是这样,可以避免这种情况
State &tmp = *s;
【问题讨论】:
-
是的,
State tmp = *s;制作副本。使用参考。 -
谢谢大家。您还帮助消除了性能瓶颈。此状态对象的复制成本很高。
标签: c++ destructor dereference