gpt4 book ai didi

c - 是否允许 C 编译器用另一种算法替换一种算法?

转载 作者:行者123 更新时间:2023-12-03 18:32:07 25 4
gpt4 key购买 nike

例如,您具有带有bubbleort实现的函数sort(int* numbers, size_t count),并且C编译器可以识别此模式。是否允许编译器将其更改为另一个示例?像快速排序。
另一个例子是将所有数字从 0 添加到 n ,编译器可以用 (n*(n-1))/2 替换 for 循环。

最佳答案

如果被调用的函数在优化域内,即使函数是另一个文件,也有办法做到这一点,然后是。与在同一文件中具有被调用函数的方式相同。但这并不意味着编译器会根据函数的名称假设被调用的代码到底是什么,您可以轻松地创建自己的 C 库并将其链接起来,并让命名函数(例如 qsort)做您想做的任何事情.所以这是不可取的,但工具可以做到:

#include <stdio.h>
void fun ( void )
{
printf("0");
}
Disassembly of section .text:

00000000 <fun>:
0: e3a00030 mov r0, #48 ; 0x30
4: eafffffe b 0 <putchar>
编译器已将所需的函数调用替换为其他一些函数调用。
所以是的,如果优化器被编程,可以并且将会这样做。如果它具有可见性,则更有可能将两个部分作为一个整体进行优化:
unsigned int more_fun ( unsigned int a, unsigned int b )
{
return(a+b);
}
unsigned int fun ( void )
{
return(more_fun(1,2));
}

Disassembly of section .text:

00000000 <more_fun>:
0: e0800001 add r0, r0, r1
4: e12fff1e bx lr

00000008 <fun>:
8: e3a00003 mov r0, #3
c: e12fff1e bx lr
它不是像 printf 示例那样用另一个函数替换一个函数,而是用一个可能更优化的内联解决方案替换优化的函数。
是的,当然有些编译器会优化一个死循环:
unsigned int fun ( void )
{
unsigned int ra;
for(ra=0;ra<10;ra++)
{
}
return(ra);
}

00000000 <fun>:
0: e3a0000a mov r0, #10
4: e12fff1e bx lr
当然这是一个微不足道的,但我已经生成了像这样的死代码的伪随机化器,取决于编译器/优化器和代码,如果它已经被编程,它将把循环/代码简化为更简单的东西。
或者这就是你要问的:
unsigned int more_fun ( unsigned int n )
{
return((n*(n-1))/2);
}
unsigned int fun ( void )
{
return(more_fun(10));
}

00000000 <more_fun>:
0: e2403001 sub r3, r0, #1
4: e0020093 mul r2, r3, r0
8: e1a000a2 lsr r0, r2, #1
c: e12fff1e bx lr

00000010 <fun>:
10: e3a0002d mov r0, #45 ; 0x2d
14: e12fff1e bx lr
在可能的情况下删除数学。
您不能假设特定的编译器会执行此操作,也不能期望两个编译器生成相同的代码/优化。但是编译器可以并且愿意这样做,是的,如果它被编程为并且可以看到它需要优化的所有代码。
就“允许”而言,编译器的工作是在功能上用另一种语言替换一种语言,这就是为什么任何两个从一种语言翻译成另一种语言(相同输入语言到相同输出目标)的编译器可以并且将产生不同的输出代码的部分原因,它是一个功能替代品,编译输出没有一个正确的答案,它可能会有所不同。因此,在可能的情况下,每种语言,如上所示,编译器生成功能等效的代码,这就是它的工作,因此它被允许执行该工作。虽然我不会将 putchar 视为 printf 替代品,因为编译器没有查看我的 printf 代码,但同时我假设这个编译器(gcc)有一个命令行选项不允许这样做。同样,编译器替换结构赋值的情况并不少见,两个相同类型的结构 a = b;使用 memcpy,但同时有一个命令行选项,表明我不想让你用 memcpy 替换我要求的代码,我希望它离散地完成。
在 gcc 和 clang 之间你会看到这些行为,就“允许”这个词而言,我想这是允许的。如图所示,您可以检查编译器输出并查看您的用例,编译器做了什么。

关于c - 是否允许 C 编译器用另一种算法替换一种算法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63174267/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com