我读过大多数代码使用标准的错误处理(从功能并且这样的返回值)一个int。但我不知道是否有任何从使用uint_8将编译器有益处 - 阅读:大多数C编译器在大多数架构 - 使用立即寻址模式产生的指令 - 即嵌入1个字节的整数进指令?关键的指令,我想的是一个功能之后的比较,使用uint_8作为它的返回类型,退货。

我可以思考的东西不正确,如引入1个字节类型只是导致对齐问题 - 有可能是一个非常理智的原因,像编译打包在4字节的东西,这是每个人都可能是原因,只使用整数 - 而且由于这是堆栈相关的问题,而不是堆有没有真正的开销

做正确的事是什么,我想。但让说发言权为参数的缘故。这是一个智能手表流行廉价微处理器,它被配置为与存储器1K但是拥有在它的指令集不同的寻址模式:d

要略微专门的讨论(86)将是另一个问题是:是字面中:

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

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

同类型?或将编译器产生一8字节在第二种情况下文字。如果是这样,它可以使用它来生成一个比较,其具有的文字作为立即值和返回INT为寄存器参考指令。 参见CMP指令类型。

另一个REFFERENCE为x86指令集。

有帮助吗?

解决方案

下面就是一个特定的编译器将以下代码做到:

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()返回一个字符,我们得到  B:3C 1F CMP $ 0x1F的,%人

如果你正在寻找的效率虽然。不要假定比较东西以%a1为比%eax中

比较快

其他提示

有可能是在一个特定的体系结构不同的积分类型之间非常小的速度差。但是你不能依赖它,如果你移动到不同的硬件可能会改变,如果你升级到更新的硬件也可以运行,甚至更慢。

如果你谈论的x86在你给的例子,你犯了一个错误的假设:一个迫切需求是类型uint8_t的。

实际上嵌入到指令的8位的立即是类型int8_t的,并且可以与字节,字,双字和四字被使用,在C表示法:charshortintlong long

因此,在这个体系结构就没有益处可言,既不代码大小也不执行速度。

您应该使用int或unsigned int类型的计算。使用较小的类型只对化合物(结构/阵列)。其原因是,INT通常被定义为“最自然的”积分用于处理器类型,所有其它派生类型可能需要处理,以正常工作。我们在我们的项目中使用GCC在Solaris编译SPARC访问8位和16位变量添加到代码的指令的情况下。当从存储器加载一个较小的类型也必须确保寄存器的上半部分被正确设置(有符号型或0的无符号的符号扩展)。这使得代码长,对寄存器,恶化其他的优化增加的压力。

我有一个具体的例子:

我声明的结构作为uint8_t的两个可变和得到在的Sparc ASM的代码:

    if(p->BQ > p->AQ)

被翻译在

ldub    [%l1+165], %o5  ! <variable>.BQ,
ldub    [%l1+166], %g5  ! <variable>.AQ,
and     %o5, 0xff, %g4  ! <variable>.BQ, <variable>.BQ
and     %g5, 0xff, %l0  ! <variable>.AQ, <variable>.AQ
cmp     %g4, %l0    ! <variable>.BQ, <variable>.AQ
bleu,a,pt %icc, .LL586  !

在这里,我得到了什么,当我宣布这两个变量为uint_t

lduw    [%l1+168], %g1  ! <variable>.BQ,
lduw    [%l1+172], %g4  ! <variable>.AQ,
cmp     %g1, %g4    ! <variable>.BQ, <variable>.AQ
bleu,a,pt %icc, .LL587  !

两个算术运算更少和2个寄存器用于更多其他的东西

处理器通常喜欢用它们的自然寄存器大小,其在C为“INT”。

的工作

虽然也有例外,你想在一个不存在的问题太多了。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top