首页 > 解决方案 > 从特定索引开始复制数组的 x 元素的最快方法

问题描述

我是 C 的初学者,正在玩指针和数组。

假设我有以下功能

GetArrayValues(uint8**pValues, uint32 *pNumValues);

在哪里:

**pValues points to the first element of the array

*pNumValues points to the number of values in the array

假设数组包含 100 个 uint8 元素。

现在每次调用该函数时,GetArrayValues()我都想将从索引 20 开始的所有 30 个元素复制到一个新数组中:

uint8 myInternalArray[30]

最快的方法是什么?

标签: carrayspointers

解决方案


一般来说; 做某事的最快方法是想办法避免做某事,然后什么也不做。例如,如果数组及其副本不会被修改,您可以只使用指向相同数据的不同指针而不进行复制。以类似的方式,如果某些内容很少被修改,您可能能够在最初避免复制,然后(很少)在实际修改某些内容时进行复制。

如果你不能这样做;那么第二快的方法是尽量减少你不避免的工作量。例如; 复制数据涉及从一个地方读取原始数据并将其写入另一个地方;但也许您可以在创建原件时创建副本,以避免以后从原件中读取。

如果你不能这样做;那么第三快的方法是使用内联汇编或内在函数。例如; 对于现代 80x86 CPU(带有 AVX2),如果您复制 2 个额外的“未使用”字节,那么您可以使用 2 条指令来完成(将 32 个字节加载到寄存器中,然后将寄存器存储在其他地方)。对于极端情况,也许您可​​以将副本保存在寄存器中并通过一次加载来完成。

如果你不能这样做;那么第四快的方法可能是使用memcpy(). 请注意,编译器可能能够优化代码,使其memcpy()变得与内联汇编或内在函数一样好;但是,在这种情况下,您必须确保编译器知道它可以修改 2 个额外的“未使用”字节 - 否则它将使用较慢的方法(以避免损坏可能在结束后的其他内容30 字节副本)。


推荐阅读