如何将一个向量复制到另一个向量?

3

假设我有这个:

const int MAX_BUFFER = 1024;
std::vector<double> AV(MAX_BUFFER);
std::vector<double> CV{ AV };

AV如何复制到CV中?

如果我使用double数组(即double [])进行相同的操作,它需要更多时间(在MSVC上使用性能分析器和/Oi测试过):

for (int sampleIndex = 0; sampleIndex < MAX_BUFFER; sampleIndex++) {
    C[sampleIndex] = A[sampleIndex];
}

它是如何更快地复制的?我用C++数组标准该怎样做?

你的意思是什么?这取决于优化级别,可能会在/O3中使用memcpy。 - Matthieu Brucher
1
使用 std::memcpy - PaulMcKenzie
你真的需要使用“标准数组”吗?为什么不直接使用向量? - Galik
2
请注意,优化取决于您的向量的value_type。对于POD(普通旧数据)类型,例如doubleint,最佳性能可能使用std::memcpy来实现。对于非POD类型(例如std::string),无法使用std::memcpy - Fureeish
2
你知道 std::copy 吗?它应该选择最快的方法。但我很想知道你测试过什么代码。 - Galik
2
std::vector 构造函数以及 std::copy() 通常针对 POD 类型进行特化,内部使用 memcpy() - zett42
2个回答

7
这很难以绝对的确定答案,因为它取决于您的工具链和优化级别,也在一定程度上取决于运气。
我可能会期望一个强大的编译器将您的循环优化为一个无需计数器和单独值拷贝的memcpy。或者也许不会。肯定的是,你的编译器似乎没有这样做。
我肯定会期望向量复制这样做(因为编写vector实现的人很聪明,他们会发现这个机会)。
最终,您必须阅读实现的源代码才能确切地找出答案。 如果您想尽可能快地复制double[]内容,请使用std::copy 这个操作应该执行那个优化。肯定不会比您的循环慢,而且可能更快。如果由于某种原因它不是这样,请尝试直接使用memcpy(尽管这会消除类型安全性)。
memcpy为什么更快?
计算机可以在一次操作中迅速地移动大块数据,只要它们预先知道您想要做什么就行。
事实上,这是写"说出您的意思"的代码并让计算机决定如何处理它的良好教训,而不是拼写您认为任务需要的个别步骤,并因此使计算机更难以用最佳方式做到您真正想要的。
在这种情况下,"计算机"是标准库实现、编译器和CPU的一个无形合作伙伴。

如果我创建了一个向量但没有初始化,CV{ AV }; 的等效方式是什么?例如,写入 std :: vector <double> CV ,几行代码后以同样的方式 "块复制"它?CV = AV?速度相同? - markzzz
@markzzz 是的,等效操作。如果您不需要调整现有缓冲区(如果有),则稍微快一些。因为不要忘记第一个向量构造也需要分配内存。 - Lightness Races in Orbit

4

你可以使用标准算法来实现类似于数组的简洁和易读性:

std::copy(A, A + MAX_BUFFER, B);

就速度而言,它取决于标准库的实现方式以及编译器如何优化您的循环。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接