【发布时间】:2016-05-13 03:15:27
【问题描述】:
我有一个由其他人编写的函数,我确定在函数块中的每个语句完全执行后,有时可能需要很长时间才能退出该函数。如果我没记错的话,在此期间唯一发生的事情是调用堆栈(本地)对象上的所有析构函数,然后函数在堆栈指针移动时返回。我想发布这个功能,但它有点复杂,而且是别人的知识产权。但是,只有标准 STL 容器在堆栈上声明。容器是
set<unsigned int>
unordered_map<unsigned_int, vector<unsigned int>>
vector<pair<set<unsigned int>,set<unsigned int> > >
vector<pair<set<unsigned int>,int> >
set<unsigned int>
several unsigned ints
unordered_map<unsigned int, unordered_map<unsigned int, bool> >
set<unsigned int>
set<unsigned int>
有谁知道为什么会发生这种情况?我认为时间可能会被对本地声明的 STL 对象的析构函数调用所消耗。以前有人见过这种情况吗?我还应该去哪里看看?
【问题讨论】:
-
容器中有多少数据?
-
ints 的销毁是微不足道的,vectors 只需进行一次释放。但是,sets 通常使用 N 个节点来保存数据,因此需要进行 N 次重新分配,这在放在一起时可能会非常昂贵。 (在这方面无法评论unordered_map) -
您可以通过
.clear()ing 最后的所有结构和计时来测试它是否是析构函数 -
@immibis,我不确定/尚未检查,但可能很多。但是在析构函数调用之前执行该函数并不需要太多时间。为什么销毁对象比在对象中插入数据要花费更多的时间?
-
@vu1p3n0x,这是个好主意……我会试试的。
标签: c++ performance stl destructor