GCC代替循环用的memcpy和memset
问题描述:
我有以下简单的程序:GCC代替循环用的memcpy和memset
:/usr/gcc-arm-none-eabi-5_4-2016q3/bin/arm-none-eabi-gcc -mthumb -O3 -o main.o -c main.c
GCC方便地分别memcpy
和memset
替换循环:
#define N 20
long c[N];
long a[N + N];
void f(void)
{
long *s = c;
long *p = a;
while (p != a + N) *p++ = *s++;
while (p != a + N + N) *p++ = 0;
}
我编译
00000000 <f>:
0: b570 push {r4, r5, r6, lr}
2: 4d07 ldr r5, [pc, #28] ; (20 <f+0x20>)
4: 4c07 ldr r4, [pc, #28] ; (24 <f+0x24>)
6: 002a movs r2, r5
8: 4907 ldr r1, [pc, #28] ; (28 <f+0x28>)
a: 0020 movs r0, r4
c: f7ff fffe bl 0 <memcpy>
10: 1960 adds r0, r4, r5
12: 002a movs r2, r5
14: 2100 movs r1, #0
16: f7ff fffe bl 0 <memset>
1a: bc70 pop {r4, r5, r6}
1c: bc01 pop {r0}
1e: 4700 bx r0
很明显,gcc很聪明,并决定图书馆y实施更有效率,在每种特定情况下可能会也可能不会。我想知道如何避免这种行为,例如,速度不重要,图书馆电话是不可取的。
答
您正在使用标志-O3,它会强制编译器运行所有可用的优化方法,尝试使用较低的值,例如-O2或-O。
答
好了,通过https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html搜索显示了以下选项:
-ftree-loop-distribute-patterns
Perform loop distribution of patterns that can be code generated with calls to a library. This flag is enabled by default at -O3.
指定-fno-tree-loop-distribute-patterns
避免接触标准库中似乎没有影响其他的优化。
您明确告诉编译器使用'-O3'命令行选项进行优化 - 这不是默认设置。如果您希望编译器不那么激进,请使用其他优化设置,或者甚至不进行优化设置。 – Peter
这几乎是https://stackoverflow.com/a/33818680/1162141 – technosaurus
的副本。实际上,它是。不幸的是,我找不到'memcpy loop'。很多关于“什么更快?”的帖子谢谢。 –