Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 做指针算术会产生除法的代价吗_C - Fatal编程技术网

C 做指针算术会产生除法的代价吗

C 做指针算术会产生除法的代价吗,c,C,我正在一个嵌入式处理器上工作,在那里进行除法的成本很高。在跟踪汇编输出中的divide调用时,我惊讶地看到指针算术生成了对divide函数的调用 除非结构的大小是2的幂,否则我看不出编译器如何避免除法。有人知道像gcc这样更聪明的编译器是否能设法避免这种情况吗?常数除法通常可以优化为大范围乘法,然后进行移位。这对你来说可能还是太慢了,我不知道。但这仅适用于指针减法,这可能是可以避免的,具体取决于您如何使用它。在某些处理器上,当启用完全优化时,编译器可以进行强度缩减,将除法转换为乘法。例如,它们不

我正在一个嵌入式处理器上工作,在那里进行除法的成本很高。在跟踪汇编输出中的divide调用时,我惊讶地看到指针算术生成了对divide函数的调用


除非结构的大小是2的幂,否则我看不出编译器如何避免除法。有人知道像gcc这样更聪明的编译器是否能设法避免这种情况吗?

常数除法通常可以优化为大范围乘法,然后进行移位。这对你来说可能还是太慢了,我不知道。但这仅适用于指针减法,这可能是可以避免的,具体取决于您如何使用它。

在某些处理器上,当启用完全优化时,编译器可以进行强度缩减,将除法转换为乘法。例如,它们不是除以10,而是乘以3435973837,取上面的32位,这相当于乘以0.8,然后用移位除以8。

我们需要代码、编译器名称和体系结构-按顺序。如果你给我们看代码,我们可以建议一种重写它的方法来避免指针运算;T阵列[100];int findIndex(T*T){return T-array;}忽略上面的内容-这表明我缺乏标记格式方面的专业知识!该术语通常指循环优化的一种形式。您描述的优化是有效的(我想,我没有检查过),但我不认为它是通常意义上的“强度降低”。@KeithThompson:您链接中的定义是:“强度降低是一种编译器优化,其中昂贵的操作被等价但较便宜的操作所取代。”这正是事实,维基百科中的循环例子就是一个例子。@cyco130:我说过“通常”。我想我从来没有听说过这个术语用来指循环优化以外的任何东西。再说一次,我的经验不是无限的,你很可能是对的。@KeithThompson那么你把
u/2
替换为
u>>1
又叫什么呢?@Neil:嗯,优化?或者我完全错了,“力量减退”是最好的名字。