我正在开发一个嵌入式设备(STM32,ARM-Cortex M4),期望
我查看了反汇编代码,发现
memset
和类似函数进行速度优化。然而,我注意到它的行为比预期要慢得多。我正在使用GNU ARM嵌入式编译器/链接器(arm-none-eabi-gcc
等)以-O3
优化标志。我查看了反汇编代码,发现
memset
函数是每次写一个字节并在每次迭代时重新检查边界。0x802e2c4 <memset>: add r2, r0
0x802e2c6 <memset+2>: mov r3, r0
0x802e2c8 <memset+4>: cmp r3, r2
0x802e2ca <memset+6>: bne.n 0x802e2ce <memset+10>
0x802e2cc <memset+8>: bx lr
0x802e2ce <memset+10>: strb.w r1, [r3], #1
0x802e2d2 <memset+14>: b.n 0x802e2c8
自然地,这段代码可以通过使用32位写入和/或循环展开来加速,但代价是增加代码大小。实现者可能选择不为了速度进行优化,以保持代码大小。
memset
头文件和库被包括在:
C:\Program Files (x86)\GNU Tools Arm Embedded\7 2018-q2-update\arm-none-eabi\include\string.h
C:\Program Files (x86)\GNU Tools Arm Embedded\7 2018-q2-update\arm-none-eabi\include\c++\7.3.1\cmath
这个问题类似于现有的问题,但不同之处在于它针对嵌入式平台。
在GNU ARM嵌入式软件包中是否有可用的优化memset函数?如果有,如何访问它?
std::fill
。这有很大可能会被编译器优化。 - SergeyAlibc.a
变体都使用了该优化。您使用哪个发布版本?你有什么源代码,如何编译/链接呢? - Erlkoenigstd::fill
时,编译器有优化现场的奢侈品。然而,我必须承认,在尝试时,我在godbolt上没有看到任何优化。 - SergeyA