inline void duplicate_32fc(lv_32fc_t *out, lv_32fc_t in, int size) {
int n = 1;
int last_n;
if (n < 1)
return;
//Copy the first one
out[0] = in;
//Double the size of the copy for each copy
while (n*2 <= size) {
memcpy(&out[n], out, n * sizeof(lv_32fc_t));
last_n = n;
n = n * 2;
}
//Copy the tail
if (last_n < size) {
memcpy(&out[last_n], out, (size - last_n) * sizeof(lv_32fc_t));
}
}
8条答案
按热度按时间0dxa2lsx1#
在OS X上,可以使用
memset_pattern4( )
;我希望其他平台也有类似的API。除了用循环填充缓冲区(非常简单)之外,我不知道还有什么简单的可移植解决方案。
um6iljoc2#
递归地复制内存,使用你已经填充的区域作为模板,每次迭代O(log(N)):
我的意思是O(log(N))的运行时间将比手动填充内存快得多,因为
memmove()
通常使用特殊的、手动优化的汇编循环,速度非常快。bq8i3lrv3#
一种有效的方法是将指针转换为所需字节大小的指针(例如
uint32_t
为4字节),然后用整数填充。未测试!
bis0qfac4#
如果您的模式适合
wchar_t
,则可以像使用memset()
一样使用wmemset()
。8yoxcaq75#
正常的方法是手动设置前四个字节,然后设置
memcpy(ptr+4, ptr, len -4)
这会将前四个字节复制到后四个字节,然后将后四个字节复制到第三个字节,依此类推。
请注意,这“通常”是可行的,但不保证一定可行,具体取决于您的CPU体系结构和C运行时库。
wecizke36#
您可以在某处设置序列,然后使用
memcpy()
将其复制到所需位置。58wvjzkj7#
标准C库没有这样的函数。但是memset通常被实现为一个展开的循环,以最小化分支和条件检查:
好的编译器可能会使用一些特定于CPU的指令来进一步优化它(例如,使用SSE 128位存储),但即使没有优化,它也应该与库memset一样快,因为这样的简单循环是内存访问绑定的。
pgccezyw8#
今天,当我不得不在内存对齐数组中复制一个复杂的标量,以便使用Volk执行SIMD乘法时,我就在考虑这个问题。我看到了上面的解决方案,但我对编译器的了解还不足以说明哪些可以优化,哪些不可以优化。我计划对其中的一些建议进行基准测试,但我想到的解决方案是:
每次迭代都会把之前的所有副本复制到新的空间,所以我认为这是O(log(n)),不是吗?