【问题标题】:Under which circumstances will std::vector.clear() call a destructor?在什么情况下 std::vector.clear() 会调用析构函数?
【发布时间】:2013-08-14 10:54:52
【问题描述】:

我遇到了一个问题,即在 n > 1,000,000 的大向量上调用 std::vector.clear() 需要很多秒。

目前是结构体的std::vector,基本上是POD。析构函数中不需要清理。我考虑将结构更改为类,因为我想向它们添加一些函数,但我不确定这将如何影响对大量这些类/结构的向量调用 clear。

归结为想知道 std::vector.clear() 何时会调用析构函数。我的印象是,现在 C++ 中的类和结构没有区别,除了结构成员默认为公共。

我不想仅仅因为我想保证不调用析构函数而不得不切换到使用 malloc、realloc 和释放自己并跟踪大小,但似乎我什至会受到性能影响调用 clear() 时。

【问题讨论】:

  • 什么是“大量时间”?
  • 你是否为你的结构提供了析构函数?如果你声明了它,它就不再是一个 POD。
  • 基本上是 POD。 POD 是一个明确的类别,一个类型要么是 POD,要么不是 POD,它不能基本上是 POD。那是什么? --这个问题的答案与您的问题非常相关
  • 您确定您使用的是 POD 吗?检查 stackoverflow.com/questions/4178175/… 了解 POD 的组成部分。
  • 如果这与您的 previous question 有关,那么您的 ORDER 结构包含 std::vector 而不是 POD。

标签: c++ malloc stdvector


【解决方案1】:

在结构和类之间切换不会有任何区别——你说得对,它们之间的唯一区别是默认可见(结构是公共的,类是私有的)。

重要的是容器中的项目是否具有重要的析构函数。如果它们不重要,它们将被调用。如果它们是微不足道的,那么(至少一般情况下)将不会真正调用任何东西。

在不了解当前代码和/或花费时间的地方的情况下,很难就如何加快速度给出体面的建议。在你的位置上,我会认真考虑分析代码。一旦你确切地知道时间花在哪里,你就有一些改进的机会——但在那之前,你几乎是在黑暗中射击——你可能会尝试改进一些需要花费(几乎)没有时间开始,所以你的改进没有任何区别,或者你可能会做一些重要的事情,但最终会变得更慢而不是更快。

【讨论】:

  • 确实,对于一个具有微不足道的析构函数的类(这是 POD 的一项要求),它的生命周期甚至不会在您调用 clear 时结束。在底层分配块可能被释放之前,您仍然可以访问它。但是 OP 的注释“在析构函数中不需要清理”似乎暗示有一个用户声明的析构函数,它们不是 POD。
  • @Potatoswatter - 没有析构函数,至少没有用户定义的析构函数。我要仔细检查一下我没有做一些愚蠢的事情,比如使用 std::string 作为成员。
猜你喜欢
  • 2022-10-15
  • 2011-03-11
  • 2023-04-04
  • 2010-11-18
  • 1970-01-01
  • 2016-07-16
  • 1970-01-01
  • 2012-10-04
相关资源
最近更新 更多