【发布时间】:2011-05-08 19:00:21
【问题描述】:
我需要分析一个执行大量数组副本的应用程序,所以我最终分析了这个非常简单的函数:
typedef unsigned char UChar;
void copy_mem(UChar *src, UChar *dst, unsigned int len) {
UChar *end = src + len;
while (src < end)
*dst++ = *src++;
}
我正在使用 Intel VTune 进行实际分析,从那里我发现使用 gcc -O3 和“普通” gcc (4.4) 进行编译时存在显着差异。
为了理解为什么和如何,我得到了两个编译的汇编输出。
未优化的版本是这个:
.L3:
movl 8(%ebp), %eax
movzbl (%eax), %edx
movl 12(%ebp), %eax
movb %dl, (%eax)
addl $1, 12(%ebp)
addl $1, 8(%ebp)
.L2:
movl 8(%ebp), %eax
cmpl -4(%ebp), %eax
jb .L3
leave
所以我看到它首先从 *src 加载一个 dword 并将低字节放入 edx,然后将其存储到 *dst 并更新指针:很简单。
然后看到优化版,什么都不懂。
编辑:here 有优化的程序集。
因此我的问题是:gcc 可以在这个函数中做什么样的优化?
【问题讨论】:
-
使用 memcpy - 它应该比你的循环快得多。
-
请将优化后的输出复制到您的问题中。
-
我不能使用 memcpy,因为我可以有重叠。
-
@akappa:然后使用
memmove。它可以处理重叠。
标签: c optimization compiler-construction assembly