Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在什么情况下std::vector.clear()将调用析构函数?_C++_Malloc_Stdvector - Fatal编程技术网

C++ 在什么情况下std::vector.clear()将调用析构函数?

C++ 在什么情况下std::vector.clear()将调用析构函数?,c++,malloc,stdvector,C++,Malloc,Stdvector,我遇到了一个问题,在n>1000000的大向量上调用std::vector.clear()需要很多秒 它目前是结构的std::vector,基本上是POD。析构函数中不需要清理。我考虑过将结构更改为类,因为我想向它们添加一些函数,但我不确定这将如何影响对大量此类/结构向量的clear调用 归结起来就是想知道std::vector.clear()何时调用析构函数。在我的印象中,现在C++中的一个类和一个结构没有什么区别,除了结构成员默认为公共。 我不想切换到使用malloc、realloc和fre

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

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

归结起来就是想知道std::vector.clear()何时调用析构函数。在我的印象中,现在C++中的一个类和一个结构没有什么区别,除了结构成员默认为公共。
我不想切换到使用malloc、realloc和free,并跟踪大小,因为我想保证不会调用析构函数,但似乎即使在调用clear()时,我也会受到性能的影响

重要的是容器中的项是否具有非平凡的析构函数。如果它们是非平凡的,就会被调用。如果它们是琐碎的,那么(至少一般来说)就不会有任何东西可以调用


如果不真正了解当前代码和/或所花时间的消耗情况,就很难给出关于如何加快速度的合理建议。在你的位置上,我会认真考虑分析代码。一旦你确切地知道时间花在哪里,你就有机会改进事情——但在那之前,你几乎是在黑暗中拍摄——你可能会尝试改进一些不需要(几乎)时间就可以开始的事情,所以你的改进没有什么不同,或者你可能会做一些重要的事情,但是最终会使它变慢而不是变快。

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

重要的是容器中的项是否具有非平凡的析构函数。如果它们是非平凡的,就会被调用。如果它们是琐碎的,那么(至少一般来说)就不会有任何东西可以调用


如果不真正了解当前代码和/或所花时间的消耗情况,就很难给出关于如何加快速度的合理建议。在你的位置上,我会认真考虑分析代码。一旦你确切地知道时间花在哪里,你就有机会改进事情——但在那之前,你几乎是在黑暗中拍摄——你可能会尝试改进一些不需要(几乎)时间就可以开始的事情,所以你的改进没有什么不同,或者你可能会做一些重要的事情,但最终会使它变慢而不是变快。

什么是“大量时间”?您是否为结构提供了析构函数?如果你声明它不再是一个豆荚,它基本上是豆荚。豆荚是一个明确的类别,一个类型要么是豆荚要么不是豆荚,它基本上不能是豆荚。那是什么呢--这个问题的答案与你的问题非常相关。你确定你在使用POD吗?检查POD的构成要素。如果这与您的订单结构相关,那么您的订单结构包含一个
std::vector
,而不是POD。什么是“有效时间”?您是否为您的结构提供了析构函数?如果你声明它不再是一个豆荚,它基本上是豆荚。豆荚是一个明确的类别,一个类型要么是豆荚要么不是豆荚,它基本上不能是豆荚。那是什么呢--这个问题的答案与你的问题非常相关。你确定你在使用POD吗?检查POD的构成要素。如果这与您的订单结构相关,那么您的订单结构包含一个
std::vector
,而不是POD。事实上,对于一个具有小型析构函数的类(这是POD的一个要求),当您调用
clear
时,它的生命周期甚至不会结束。在底层分配块被释放之前,您仍然可以访问它。但是OP注意到“析构函数中不需要清理”似乎暗示有一个用户声明的析构函数,它们不是POD。@Potatostater-没有析构函数,至少没有用户定义的析构函数。我将再次检查我是否做了一些愚蠢的事情,比如使用std::string作为成员。事实上,对于一个具有简单析构函数的类(这是POD的一个要求),当您调用
clear
时,它的生存期甚至不会结束。在底层分配块被释放之前,您仍然可以访问它。但是OP注意到“析构函数中不需要清理”似乎暗示有一个用户声明的析构函数,它们不是POD。@Potatostater-没有析构函数,至少没有用户定义的析构函数。我将再次检查我是否做了一些愚蠢的事情,比如使用std::string作为成员。