c - 从特定索引开始复制数组的 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]
最快的方法是什么?
解决方案
一般来说; 做某事的最快方法是想办法避免做某事,然后什么也不做。例如,如果数组及其副本不会被修改,您可以只使用指向相同数据的不同指针而不进行复制。以类似的方式,如果某些内容很少被修改,您可能能够在最初避免复制,然后(很少)在实际修改某些内容时进行复制。
如果你不能这样做;那么第二快的方法是尽量减少你不避免的工作量。例如; 复制数据涉及从一个地方读取原始数据并将其写入另一个地方;但也许您可以在创建原件时创建副本,以避免以后从原件中读取。
如果你不能这样做;那么第三快的方法是使用内联汇编或内在函数。例如; 对于现代 80x86 CPU(带有 AVX2),如果您复制 2 个额外的“未使用”字节,那么您可以使用 2 条指令来完成(将 32 个字节加载到寄存器中,然后将寄存器存储在其他地方)。对于极端情况,也许您可以将副本保存在寄存器中并通过一次加载来完成。
如果你不能这样做;那么第四快的方法可能是使用memcpy()
. 请注意,编译器可能能够优化代码,使其memcpy()
变得与内联汇编或内在函数一样好;但是,在这种情况下,您必须确保编译器知道它可以修改 2 个额外的“未使用”字节 - 否则它将使用较慢的方法(以避免损坏可能在结束后的其他内容30 字节副本)。
推荐阅读
- python - 从 GitLab 解码文本文件导致 UnicodeEncodeError
- c# - 如何在主方法c#中调用我的方法?
- html - 导航栏未正确居中,左侧的空白区域稍多
- javascript - jQuery 过滤器和效果不适用于 React JS 中的动态数据
- javascript - 为什么我不能快速访问从我的 API 中获取的 JSON 对象的子属性
- reactjs - react.js 谷歌分析不起作用。没有显示实时数据
- microsoft-graph-api - 为什么调用 Http 请求时出现错误
- javascript - 延迟 node.js HTTP 请求
- mod-rewrite - 为什么 httpd.conf 中的 rewriteRule 在这个 Apache 代理服务器上不起作用?
- powershell - aws cli sync 命令的流式输出到 powershell 主机