gcc linux 宏,gcc - Linux内核中可能/不太可能的宏如何工作以及它们的好处是什么?...

让我们反编译看看GCC 4.8对它的作用

没有__builtin_expect

#include "stdio.h"

#include "time.h"

int main() {

/* Use time to prevent it from being optimized away. */

int i = !time(NULL);

if (i)

printf("%d\n", i);

puts("a");

return 0;

}

使用GCC 4.8.2 x86_64 Linux编译和反编译:

gcc -c -O3 -std=gnu11 main.c

objdump -dr main.o

输出:

0000000000000000 :

0: 48 83 ec 08 sub $0x8,%rsp

4: 31 ff xor %edi,%edi

6: e8 00 00 00 00 callq b

7: R_X86_64_PC32 time-0x4

b: 48 85 c0 test %rax,%rax

e: 75 14 jne 24

10: ba 01 00 00 00 mov $0x1,%edx

15: be 00 00 00 00 mov $0x0,%esi

16: R_X86_64_32 .rodata.str1.1

1a: bf 01 00 00 00 mov $0x1,%edi

1f: e8 00 00 00 00 callq 24

20: R_X86_64_PC32 __printf_chk-0x4

24: bf 00 00 00 00 mov $0x0,%edi

25: R_X86_64_32 .rodata.str1.1+0x4

29: e8 00 00 00 00 callq 2e

2a: R_X86_64_PC32 puts-0x4

2e: 31 c0 xor %eax,%eax

30: 48 83 c4 08 add $0x8,%rsp

34: c3 retq

内存中的指令顺序未更改:首先返回__builtin_expect,然后返回__printf_chk和puts。

随着__builtin_expect

现在替换__builtin_expect:

if (__builtin_expect(i, 0))

我们得到:

0000000000000000 :

0: 48 83 ec 08 sub $0x8,%rsp

4: 31 ff xor %edi,%edi

6: e8 00 00 00 00 callq b

7: R_X86_64_PC32 time-0x4

b: 48 85 c0 test %rax,%rax

e: 74 11 je 21

10: bf 00 00 00 00 mov $0x0,%edi

11: R_X86_64_32 .rodata.str1.1+0x4

15: e8 00 00 00 00 callq 1a

16: R_X86_64_PC32 puts-0x4

1a: 31 c0 xor %eax,%eax

1c: 48 83 c4 08 add $0x8,%rsp

20: c3 retq

21: ba 01 00 00 00 mov $0x1,%edx

26: be 00 00 00 00 mov $0x0,%esi

27: R_X86_64_32 .rodata.str1.1

2b: bf 01 00 00 00 mov $0x1,%edi

30: e8 00 00 00 00 callq 35

31: R_X86_64_PC32 __printf_chk-0x4

35: eb d9 jmp 10

__builtin_expect(编译为__printf_chk)被移动到函数的最后,在puts之后,并返回改进分支预测,如其他答案所述。

所以它基本上是相同的:

int i = !time(NULL);

if (i)

goto printf;

puts:

puts("a");

return 0;

printf:

printf("%d\n", i);

goto puts;

没有使用__builtin_expect进行此优化。

但是写一个运行速度比__builtin_expect更快的例子好运,那些时候CPU非常聪明。 我天真的尝试就在这里。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
gcc-linaro-arm-linux-gnueabihf-4.9-2014.09_linux.tar.bz2是一个软件包,它是Linaro组织提供的用于ARM架构的GCC编译器。这个编译器是为GNU/Linux操作系统和嵌入式开发环境而设计的。 这个软件包采用.tar.bz2的格式,即打包和压缩的文件格式。通过解压缩这个文件,我们可以得到该编译器的安装文件和相关的文档。 gcc-linaro-arm-linux-gnueabihf是一个目标架构为ARM的GCC交叉编译器。交叉编译器是一种特殊的编译器,用于在一个平台上进行开发,但生成在另一个平台上运行的代码。这个编译器特别适用于嵌入式开发,因为它可以在一台PC上编写和测试代码,然后将其部署到ARM架构的目标设备上运行。 4.9-2014.09代表这个编译器的版本号,其4.9是GCC的主要版本号,2014.09是Linaro团队为此版本发布的日期。版本号的改变通常意味着代码的改进和错误修复,因此更新版本的编译器可能具有更好的性能和更少的错误。 通过使用这个编译器,开发人员可以方便地为ARM架构的设备开发软件,包括嵌入式系统、嵌入式Linux内核和驱动程序等。它提供了许多工具和库,可以帮助开发者更高效地进行ARM开发,并提供了丰富的文档和示例代码作为参考。同时,这个编译器也支持许多ARM处理器系列,包括Cortex-A和Cortex-M系列,以及其他一些经典的ARM处理器。 总之,gcc-linaro-arm-linux-gnueabihf-4.9-2014.09_linux.tar.bz2是一个适用于ARM架构的GCC交叉编译器软件包,它帮助开发者在PC上编写和测试代码,然后将其部署到ARM设备上运行。它是嵌入式开发重要的工具之一,提供了丰富的特性和支持,使得ARM开发更加高效和便捷。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值