C编程和error_code变量效率

标签 c cpu-architecture micro-optimization machine-instruction low-level-code

我读过的大多数代码都使用 int 进行标准错误处理(函数的返回值等)。但我想知道使用 uint_8 是否有任何好处,编译器——阅读:大多数体系结构上的大多数 C 编译器——使用立即地址模式生成指令——即嵌入指令中的 1 字节整数?我考虑的关键指令是函数后的比较,使用 uint_8 作为其返回类型,返回。

我可能想错了,因为引入 1 字节的类型只会导致对齐问题——编译喜欢用 4 字节打包东西可能有一个非常理智的原因,这可能是每个人都只使用 int 的原因-- 因为这是与堆栈相关的问题而不是堆,所以没有真正的开销。

做正确的事是我的想法。但是为了争论起见,可以说这是一种流行的廉价智能 watch 微处理器,它配置了 1k 内存,但在其指令集中确实有不同的寻址模式:D

另一个稍微专门讨论 (x86) 的问题是:文字是:

uint_32 x=func(); x==1;

uint_8 x=func(); x==1;

同类型?或者编译器会在第二种情况下生成一个 8 字节的文字。如果是这样,它可能会使用它来生成一个比较指令,该指令将文字作为立即值,并将返回的 int 作为寄存器引用。 See CMP instruction types. .

Another Refference for the x86 Instruction Set.

最佳答案

下面是一个特定的编译器将对以下代码执行的操作:

extern int foo(void) ;
void bar(void)
{
        if(foo() == 31) { //error code 31
                do_something();
        } else {
                do_somehing_else();
        }
}

   0:   55                      push   %ebp
   1:   89 e5                   mov    %esp,%ebp
   3:   83 ec 08                sub    $0x8,%esp
   6:   e8 fc ff ff ff          call   7 <bar+0x7>
   b:   83 f8 1f                cmp    $0x1f,%eax
   e:   74 08                   je     18 <bar+0x18>
  10:   c9                      leave
  11:   e9 fc ff ff ff          jmp    12 <bar+0x12>
  16:   89 f6                   mov    %esi,%esi
  18:   c9                      leave
  19:   e9 fc ff ff ff          jmp    1a <bar+0x1a>

用于 cmp 的 3 字节指令。如果 foo() 返回一个 char ,我们得到 b: 3c 1f cmp $0x1f,%al

不过,如果您正在寻找效率。不要假设比较 %a1 中的内容比与 %eax 比较快

关于C编程和error_code变量效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1832919/

相关文章:

c - 是否严格要求汇编才能使 "lowest"成为操作系统的一部分?

c++ - memory_order_consume 到底有什么作用?

c++ - 重新安排条件评估会加速循环吗?

c - 为什么 sizeof 未命名位域成员结构打印 1?

c - 在 C 中进行谓词赋值的更好方法?

c++ - 整数决定论

performance - 短环路时延

Java:微优化数组操作

c - C语言算法——谁是获胜队

c - 为什么 stdout 在重定向到文件时需要显式刷新?