gpt4 book ai didi

C编程和error_code变量效率

转载 作者:太空宇宙 更新时间:2023-11-04 00:19:47 24 4
gpt4 key购买 nike

我读过的大多数代码都使用 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/

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