Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.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++ 为什么调整指向向量*(在向量数组中)的指针的大小比调整向量(在向量数组中)的指针的大小更快?_C++_Stdvector - Fatal编程技术网

C++ 为什么调整指向向量*(在向量数组中)的指针的大小比调整向量(在向量数组中)的指针的大小更快?

C++ 为什么调整指向向量*(在向量数组中)的指针的大小比调整向量(在向量数组中)的指针的大小更快?,c++,stdvector,C++,Stdvector,调整向量的大小可能很慢? 为了寻求提高软件速度的解决方案,我尝试在vector数组中调整vector的大小,并在vector数组中调整vector*的大小* 第二个似乎更快。即使我能感觉到原因,我也没有一个明确的纯理性的解释(我不想在数组中使用向量保留,因为真正的向量是巨大的)。有吗 这是我的测试程序(在另一个使用debian 8的联想ThinkCenter i5上的结果可能不同:我不想停止的另一个任务正在运行): 我对声称的观察结果感到好奇,并能够自己复制它们。然后,我交换了两种替代实现,现在

调整向量的大小可能很慢? 为了寻求提高软件速度的解决方案,我尝试在vector数组中调整vector的大小,并在vector数组中调整vector*的大小* 第二个似乎更快。即使我能感觉到原因,我也没有一个明确的纯理性的解释(我不想在数组中使用向量保留,因为真正的向量是巨大的)。有吗

这是我的测试程序(在另一个使用debian 8的联想ThinkCenter i5上的结果可能不同:我不想停止的另一个任务正在运行):


我对声称的观察结果感到好奇,并能够自己复制它们。然后,我交换了两种替代实现,现在情况发生了变化。现在先执行的std::vector*tab[n]版本比现在第二个执行的版本要慢得多

解释很简单。C++库重用分配的内存。当你使用内存时,直接通过你自己,通过代码>新的<代码>,或者间接地,通过在容器中分配内存值,然后再释放它,C++库不会释放空闲内存返回操作系统,而是在下次需要更多内存时重用它。无需向您的操作系统索取更多信息。没有任何法律规定这是C++库必须做的,但是这是现代C++实现的典型行为。 所以,这很简单。您的第一个基准测试包括从操作系统分配大量内存所需的时间。C++需要第一次使用这些向量的内存,这需要额外的时间。代码的第二个基准部分不必这样做,因为第一个基准已经分配了内存,然后释放了内存;所以第二个基准只是导致C++库重用它已经拥有的内存,但未被使用(这是通过查看SysCurrar跟踪来明显的)。 第二次重复第一个基准测试的典型结果:

vector resize duration == 191 ticks
vector resize duration == 48 ticks
*vector resize duration== 63 ticks

我对声称的观察结果感到好奇,并能够自己复制它们。然后,我交换了两种替代实现,现在情况发生了变化。现在先执行的std::vector*tab[n]版本比现在第二个执行的版本要慢得多

解释很简单。C++库重用分配的内存。当你使用内存时,直接通过你自己,通过代码>新的<代码>,或者间接地,通过在容器中分配内存值,然后再释放它,C++库不会释放空闲内存返回操作系统,而是在下次需要更多内存时重用它。无需向您的操作系统索取更多信息。没有任何法律规定这是C++库必须做的,但是这是现代C++实现的典型行为。 所以,这很简单。您的第一个基准测试包括从操作系统分配大量内存所需的时间。C++需要第一次使用这些向量的内存,这需要额外的时间。代码的第二个基准部分不必这样做,因为第一个基准已经分配了内存,然后释放了内存;所以第二个基准只是导致C++库重用它已经拥有的内存,但未被使用(这是通过查看SysCurrar跟踪来明显的)。 第二次重复第一个基准测试的典型结果:

vector resize duration == 191 ticks
vector resize duration == 48 ticks
*vector resize duration== 63 ticks

如果你交换这些片段,会有什么不同吗?你不能从一次测量中得出结论。有太多的事情会影响它。在一个循环中测量每个版本运行10000次的时间,将该时间除以10000,您可能需要处理一些事情。这是一个微不足道的数字。你不能像这样衡量业绩!此外,可能还有缓存位置。如果你交换代码片段,这会有区别吗?你无法从单个测量中得出结论。有太多的事情会影响它。在一个循环中测量每个版本运行10000次的时间,将该时间除以10000,您可能需要处理一些事情。这是一个微不足道的数字。你不能像这样衡量业绩!还有,可能是缓存位置。我也交换了测试,得到了相同的结果。解释并不是那么简单。有可能对标准库的保留进行参数化吗?这非常简单,因为这是一种非常简单、通用的内存管理方法,任何人都可以在一门专注于操作系统设计和实现的课程中学习到这一点。目前还不清楚你在问什么,但是一般来说,你对C++库的内存分配行为没有任何低级控制,任何这样的控件,如果它们存在,显然不在C++标准的范围内,并且将对操作系统非常有影响。您需要查阅OS或C++库的技术文档来确定是否存在。我还交换了测试并得到相同的结果。解释并不是那么简单。有可能对标准库的保留进行参数化吗?这非常简单,因为这是一种非常简单、通用的内存管理方法,任何人都可以在一门专注于操作系统设计和实现的课程中学习到这一点。目前还不清楚你在问什么,但是一般来说,你对C++库的内存分配行为没有任何低级控制,任何这样的控件,如果它们存在,显然不在C++标准的范围内,并且将对操作系统非常有影响。您需要查阅OS或C++库的技术文档,以确定是否存在。
vector resize duration == 191 ticks
vector resize duration == 48 ticks
*vector resize duration== 63 ticks