相关疑难解决方法(0)

GCC 为什么一直没有运行优化?

我用 C 编写了众所周知的交换函数,并使用 gcc S 观看了汇编输出,并再次做了同样的事情,但对 O2 进行了优化

差异非常大,因为与 20 行相比,我只看到了 5 行。

我的问题是,如果优化真的有帮助,为什么不一直使用它?为什么我们非优化编译代码?

给业内人士一个额外的问题,当您在测试后发布程序的最终版本时,您是否进行了优化编译?

我正在回复您的所有评论,请阅读。

c optimization assembly gcc compiler-optimization

1
推荐指数
1
解决办法
178
查看次数

CMOVcc是否被视为分支指令?

我有memchr我要使非分支的这段代码:

.globl memchr
memchr:
        mov %rdx, %rcx
        mov %sil, %al
        cld
        repne scasb
        lea -1(%rdi), %rax
        test %rcx, %rcx
        cmove %rcx, %rax
        ret
Run Code Online (Sandbox Code Playgroud)

我不确定是否cmove是分支指令。是吗?如果是这样,如何重新排列我的代码,使其不分支?

assembly x86-64 cpu-architecture micro-optimization branch-prediction

-1
推荐指数
1
解决办法
128
查看次数

字符串操作是否因为一次访问一个字符而效率低下?

我听说

  • strlen()C 标准库中的字符串操作(例如)访问和操作字符串的字符,一次一个字符。
  • 计算机一次访问内存中的一个单词。
  • 一次访问一个字符效率低下,字符串操作的时间成本很高。

以上是真的吗?

有哪些解决方案可以提高字符串操作的时间性能?

c string performance c-strings

-1
推荐指数
1
解决办法
90
查看次数

ARM 编译器的未优化行为

在我的源代码中,我看到了arm编译器的奇怪行为,它对字符串进行了冗余迭代,这是不必要的。我在这里展示了一个最小的例子来说明这一点,并在下面提出我的问题

#include <string.h>
#define MIN(x, y) (((x) < (y)) ? (x) : (y))

int MAX_FILE_NAME = 2500;
int F(char *file){
    int file_len = MIN(strlen(file), MAX_FILE_NAME - 1);
    return file_len;
}
int main(void) {
    F(__FILE__);
    return 0 ;
}
Run Code Online (Sandbox Code Playgroud)

编译为:

arm-none-eabi-gcc -nostdlib -Xlinker -Map="m7_experiments.map" -Xlinker --cref -Xlinker --gc-sections -Xlinker -print-memory-usage -mcpu=cortex-m7 -mfpu=fpv5-sp-d16 -mfloat-abi=hard -mthumb -T "m7_experiments_Debug.ld" -o "m7_experiments.axf"  ./src/cr_startup_cm7.o ./src/crp.o ./src/flashconfig.o ./src/m7_experiments.o   

Run Code Online (Sandbox Code Playgroud)

导致:

Dump of assembler code for function F:
   0x00000104 <+0>:     push    {r4, lr}
   0x00000106 <+2>:     mov     r4, r0
   0x00000108 …
Run Code Online (Sandbox Code Playgroud)

c assembly arm

-1
推荐指数
1
解决办法
190
查看次数