我读过的大多数代码都使用 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. .
最佳答案
下面是一个特定的编译器将对以下代码执行的操作:
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/