考虑下面一段C代码 -
char sum_char(char a,char b)
{
char c = a+b;
return c;
}
涉及 -
我的问题是 -
答案 0 :(得分:2)
您描述的转换仅在抽象机器中执行。如果编译器导致相同的可观察行为,则编译器可以快捷所有这些。
当启用优化时,我的编译器会将其转换为以下汇编程序
sum_char:
.LFB0:
.cfi_startproc
leal (%rsi,%rdi), %eax
ret
.cfi_endproc
.LFE0:
.size sum_char, .-sum_char
这只是一个添加(隐藏在leal
指令中)和ret
跳转。
答案 1 :(得分:2)
char
上执行算术运算,那么你对{{执行算术运算1}}秒。让优化器负责删除平台上所有不必要的指令。在大多数情况下,CPU具有与C语言所需的语义兼容的指令,因此生成的代码将非常短。当然,如果您不需要对签名字符执行操作,则可以对无符号字符执行操作。这消除了大量的符号扩展。
答案 2 :(得分:1)
c
变量,只需return (char) (a + b);
。也就是说,我不认为这个功能有很多“优化”。它应编译为非常少的代码。如果你可以把它内联,它可能是1指令的顺序。答案 3 :(得分:0)
我不确定你问题的细节。您反复提到签名扩展而不引用任何来源;我猜你假设char
数据类型将被扩展以匹配CPU的位数,但我认为没有任何保证已经不存在这种情况。
然而,作为回答你模糊问题的一个尝试: