`
simohayha
  • 浏览: 1395666 次
  • 性别: Icon_minigender_1
  • 来自: 火星
社区版块
存档分类
最新评论

gcc对c语言中的switch的优化

阅读更多
在c语言中switch语句会被实现为一个跳转表,跳转表是一个数组,这个数组里面存的都是地址,也就是说只要你传递给它一个i,他就会返回给你,你所需要跳转的地址,这样做得好处就是执行语句的时间和条件的个数无关..不过在gcc里面他也只是条件数大于4个,才会生成这个跳转表.

请看下面的代码:
int switch_eg(int x) 
{ 
    int result = x; 

    switch (x) { 

    case 100: 
	result *= 13; 
	break; 

    case 102: 
	result += 10; 
	/* Fall through */ 

    case 103: 
	result += 11; 
	break; 

    case 104: 
    case 106: 
	result *= result; 
	break; 

    default: 
	result = 0;       
    } 

    return result; 
} 

这只是一段简单的switch语句,下面我们用一段c代码来描述汇编代码所要做得事情.
code *jt[7] = {
    loc_A, loc_def, loc_B, loc_C,  
    loc_D, loc_def, loc_D
}; 
 
int switch_eg_impl(int x) 
{ 
    unsigned xi = x - 100; 
    int result = x; 

    if (xi > 6) 
	goto loc_def; 

    /* Next goto is not legal C */ 
    goto jt[xi]; 

 loc_A:      /* Case 100 */ 
    result *= 13; 
    goto done; 

 loc_B:      /* Case 102 */ 
    result += 10; 
    /* Fall through */ 
    
 loc_C:    /* Case 103 */ 
    result += 11; 
    goto done; 

 loc_D:    /* Cases 104, 106 */ 
    result *= result; 
    goto done; 

 loc_def:  /* Default case*/ 
    result = 0; 

 done: 
    return result; 
} 

看上面的代码就很清楚了,它会对传进来的值与100进行一个减法,然后再将这个值传进switch语句.
而真实的汇编代码是怎么样的呢,我们可以看看:
switch_eg:
	pushl	%ebp
	movl	%esp, %ebp
	movl	8(%ebp), %eax   //这边得到传进来的参数
	leal	-100(%eax), %edx //这边将得到的参数和100做差
	cmpl	$6, %edx //这边和6比较,如果大于6说明下面的条件没有满足的所以默认进入default
	jbe	.L11
.L2:
	popl	%ebp
	xorl	%eax, %eax
	ret
	.p2align 4,,7
.L11:
	jmp	*.L7(,%edx,4)       //这边也就是我们上面伪码所描述的那个jt[xi]
	.section	.rodata
	.align 4
	.align 4
.L7:                    //这边就是所构造的跳转表.
	.long	.L3
	.long	.L2
	.long	.L4
	.long	.L5
	.long	.L6
	.long	.L2
	.long	.L6
	.text
.L6:                         // loc_D
	imull	%eax, %eax  
	popl	%ebp
	.p2align 4,,6
	ret
.L5:                             //loc_c
	popl	%ebp
	movl	$114, %eax
	.p2align 4,,6
	ret
.L4:                          //loc_B
	popl	%ebp
	movl	$123, %eax
	.p2align 4,,4
	ret
.L3:                          //loc_A
	popl	%ebp
	movl	$1300, %eax
	.p2align 4,,4
	ret

分享到:
评论
2 楼 mryufeng 2009-09-21  
gcc可以对标号取地址 这个特性很有用。
1 楼 dennis_zane 2007-12-08  
skip list?一直不大明白这个结构

相关推荐

    C语言程序优化.pdf

    标题《C语言程序优化.pdf》指向的是一份专注于如何优化C语言程序的文档。文档内容涉及到了C语言中一些关键的编程结构和技巧,这些都是提高代码运行效率和性能的重要组成部分。 首先,文档中提到了C语言的循环控制...

    c语言框架c语言框架c语言框架

    早期的C编译器如TurboC在DOS环境下非常流行,而现在,C编译器如GCC和Clang则支持更多的平台和特性,包括对Windows GUI环境的支持。随着计算机技术的发展,C语言也在不断演进,加入了更多现代编程特性,例如对宽字符...

    gcc.zip_C语言_DEMO_pickuyh

    在本压缩包“gcc.zip_C语言_DEMO_pickuyh”中,包含了一个关于C语言的基础测试Demo,旨在帮助用户熟悉C语言的基本语法和编程概念。C语言是一种强大的、高效的编程语言,广泛应用于系统编程、软件开发、设备驱动等多...

    LINUX内核中的GCC特性

    GCC支持的C语言扩展特性非常广泛,其中最重要的是类型发现、范围扩展等功能性扩展,以及一系列有助于生成高效代码的优化扩展。下面我们将逐一介绍这些特性。 ##### 1. 类型发现 类型发现是一种非常有用的特性,它...

    C语言经典案例集1-4章 何钦铭

    通过实践这些案例,读者可以对C语言的语法、结构以及程序设计思想有更深入的理解。 在C语言的学习过程中,第一章通常会介绍C语言的基本概念和环境设置。这可能包括如何安装编译器,如GCC,以及如何编写、编译和运行...

    c语言基础例子c语言基础例子

    3. **控制流程语句**:C语言中的控制流程语句包括条件语句(if-else)、循环语句(for、while、do-while)和选择结构(switch-case)。这些语句用于控制程序的执行流程,实现条件判断和重复执行。 4. **函数**:...

    C语言教程第五版

    理解指针的概念,学习如何声明、初始化和使用指针,以及了解指针在数组、字符串和函数中的应用,对深入C语言至关重要。 4. **数组与字符串**:数组是一系列相同类型的元素集合,而字符串是字符数组的特殊形式。了解...

    华农c语言上机实验参考

    - **控制结构**:C语言的控制结构包括选择结构(如if语句和switch语句)、循环结构(如for循环和while循环)以及跳转语句(如break和continue)。 ### 3. C语言高级特性 - **数组和指针**:数组是一种存储相同类型...

    谭浩强C语言课件WORD版

    在学习过程中,谭浩强教授的课件以其通俗易懂的语言和丰富的实例,帮助读者逐步建立起对C语言的理解。通过这份资料,学习者不仅可以掌握C语言的基本语法,还能了解到如何运用C语言进行实际问题的解决。同时,课件中...

    对C语言.zip

    1. **结构化编程**:C语言支持结构化编程思想,通过if语句、switch语句、while和for循环等控制结构,可以清晰地组织程序逻辑。 2. **类型系统**:C语言有丰富的数据类型,如整型(int)、字符型(char)、浮点型...

    c语言开发技术详解c语言开发技术详解 戴建华

    书中的源代码实例可能包含对指针的深入探讨,如指针变量的声明、指针运算、指针与数组、指针与函数等。 内存管理在C语言中占据了重要地位,学习如何动态分配和释放内存是每个C程序员的必修课。书中可能涵盖了malloc...

    C语言小游戏之“雷霆战机”.zip

    在本项目中,"C语言小游戏之‘雷霆战机’"是一个使用C语言编写的终端游戏,作为一门编程课程,特别是C语言课程的期末大作业,它旨在锻炼学生的编程能力、逻辑思维以及对C语言语法的深入理解。这个小游戏可能会包含...

    C语言简明教程(中文)

    ### C语言简明教程知识点概览 #### 一、概述 ...以上是对《C语言简明教程》中涉及的主要知识点的概述,通过系统学习这些概念和技术,读者将能够掌握C语言的基础,并为进一步深入学习打下坚实的基础。

    C语言程序案例

    5. **单片机开发环境**:通常,开发C语言单片机程序需要集成开发环境(IDE),例如Keil uVision、IAR Embedded Workbench或GCC等。这些工具提供了代码编辑、编译、链接和下载到单片机的功能,同时也有调试器用于在...

    深入解析C语言中的register关键字及其应用

    综上所述,`register`关键字在C语言中曾经是一种重要的性能优化手段,但在现代编程实践中,它的使用已经变得相对少见。开发者应该依赖于现代编译器的优化能力,并遵循最佳实践来提升程序性能。希望本文能帮助你理解`...

    c语言编程大全c语言编程大全

    10. **编译和调试**: 使用编译器(如GCC)将源代码编译成可执行文件,并学习如何使用调试工具(如GDB)来查找和修复程序中的错误。 11. **实践项目**: 通过编写实际的程序,如简单的计算器、文本处理工具等,来巩固...

    C语言资料大全1.0

    资料中的"快乐无极软件园.htm"可能是提供了一些额外的学习资源链接或相关软件下载,如C语言编译器(如GCC或TDM-GCC)、调试工具(如GDB)或者其他辅助学习工具,这些都能进一步增强学习体验。 总的来说,《C语言...

    C语言学习与实验指导

    这有助于加深对C语言基础语法的理解。 #### 实验三:条件判断与循环结构 进一步深入探索if语句、switch-case语句以及while/do-while/for三种不同类型的循环结构,并结合具体实例进行实践操作,如猜数字游戏、求...

    c语言入门flash课件

    1. **基础知识**:讲解C语言的历史、特点及环境搭建,如安装GCC编译器,设置路径,创建和运行第一个C程序——经典的"Hello, World!"。 2. **语法结构**:介绍C语言的基本语法,包括变量、常量、数据类型(如int、...

Global site tag (gtag.js) - Google Analytics