当前位置: 首页 > news >正文

手机版网站如何制作响应式网站设计思路

手机版网站如何制作,响应式网站设计思路,平顶山建设网站,wordpress首页筛选对于C开发者来说,inline是个再熟悉不过的关键字,因为默认的成员函数都是inline,也是常规高校教材中宣扬C的“优势”之一。 但是C语言其实也是支持inline关键字的,而且是很早期的gcc就支持了该关键字。在Linux0.12版本内核代码中也…

对于C++开发者来说,inline是个再熟悉不过的关键字,因为默认的成员函数都是inline,也是常规高校教材中宣扬C++的“优势”之一。

但是C语言其实也是支持inline关键字的,而且是很早期的gcc就支持了该关键字。在Linux0.12版本内核代码中也用到了该关键字。

今天码哥浅谈一下这个关键字的作用和使用。

inline的作用浅显一点说,就是将声明了该关键字的函数不以call指令调用的方式来调用,而是直接将其展开在调用函数中。似乎感觉有点像宏展开的样子?

实际不然,我们以一个C语言示例来进行说明:

inline int foo(int a)
{a *= 3;return a;
}
int main(void)
{int a = foo(2);a += foo(1);return a;
}

例子很简单,foo函数被声明了inline,作用是将输入参数扩大三倍返回。

下面我们来看看这个例子的汇编是如何的。在此之前,需要重点提示:

inline关键字只有在开启了编译优化后才会启用,且如果函数定义时不声明为inline,那么inline只发生在有inline声明之后的调用点。

无编译优化汇编

$ gcc -S a.c

我们并未开启任何编译优化,其汇编如下:

	.file	"c.c".text.globl	foo.type	foo, @function
foo:
.LFB0:.cfi_startprocpushq	%rbp.cfi_def_cfa_offset 16.cfi_offset 6, -16movq	%rsp, %rbp.cfi_def_cfa_register 6movl	%edi, -4(%rbp)movl	-4(%rbp), %edxmovl	%edx, %eaxaddl	%eax, %eaxaddl	%edx, %eaxmovl	%eax, -4(%rbp)movl	-4(%rbp), %eaxpopq	%rbp.cfi_def_cfa 7, 8ret.cfi_endproc
.LFE0:.size	foo, .-foo.globl	main.type	main, @function
main:
.LFB1:.cfi_startprocpushq	%rbp.cfi_def_cfa_offset 16.cfi_offset 6, -16movq	%rsp, %rbp.cfi_def_cfa_register 6subq	$16, %rspmovl	$2, %edicall	foomovl	%eax, -4(%rbp)movl	$1, %edicall	fooaddl	%eax, -4(%rbp)movl	-4(%rbp), %eaxleave.cfi_def_cfa 7, 8ret.cfi_endproc
.LFE1:.size	main, .-main.ident	"GCC: (GNU) 4.8.5 20150623 (Red Hat 4.8.5-39)".section	.note.GNU-stack,"",@progbits

可以看到在main中存在两个call指令调用foo函数,我们的inline关键字作用并未生效。

编译优化汇编

$ gcc -S a.c -O

我们仅启用O1优化,那么看下汇编成了什么样子呢?

	.file	"c.c".text.globl	foo.type	foo, @function
foo:
.LFB0:.cfi_startprocleal	(%rdi,%rdi,2), %eaxret.cfi_endproc
.LFE0:.size	foo, .-foo.globl	main.type	main, @function
main:
.LFB1:.cfi_startprocmovl	$9, %eaxret.cfi_endproc
.LFE1:.size	main, .-main.ident	"GCC: (GNU) 4.8.5 20150623 (Red Hat 4.8.5-39)".section	.note.GNU-stack,"",@progbits

这里,码哥没有做任何删减。

读者可能会发现,main中返回值直接给了一个立即数9,而不是jmp到foo或者使用其相关指令计算的。这说明了什么呢?

这说明了,inline并不简简单单的类似宏扩展,而是编译器在编译时将foo代码展开进main中,并且在优化剪枝等优化步骤中对展开后的整体内容做优化,进而发现foo的输入与输出以及foo的两次调用结果是一个可推算的常数值。

因此,inline的作用不仅仅是避免了call指令的使用以及其关联的压栈弹栈等操作,更是可以让编译器对整体性能做出非常多改进优化,大幅提升性能。

但是,inline也不可滥用,这是因为原本只需要一份的函数被展开到整个工程中各个使用点上,虽然效率会有些许提升,但是指令数量可能会大幅增长,导致可执行程序体积过大。

http://www.yayakq.cn/news/875260/

相关文章:

  • 太原网络公司网站斯特云流量网站
  • 个人网站建站步骤h5类作品是什么意思
  • 网站开发一年多少钱网络服务商名称
  • 苏州企业建站系统模板校园网站开发目的
  • 专业自适应网站建设极速建站wordpress插件小蜜蜂
  • 一号网站建设软件项目管理考试题及答案
  • 大型建站公司网站建设管理维护责任书格式
  • 如何做网站的优化专业做网站排名
  • 鲜花商城网站设计上海市建设安全协会网站j
  • 陵水县建设局网站深圳哪些公司需要做网站
  • 济南网站建设服务哪家好wordpress企业文化模板下载
  • 建设网站的源代码电子商务是什么专业
  • 免费网站模版 好用的简易网页制作工具
  • 简述网站建设的过程陕西交通建设集团蓝商分公司网站
  • 高密网站开发增城做网站公司
  • 北京 网站设计公司永嘉专业网站建设团队
  • 鹤壁做网站优化网红营销策略分析
  • 做公众号主页面的有哪些网站咸阳住房和城乡建设局网站
  • 长安英文网站建设网址导航大全软件下载
  • 天津市做企业标准网站微信商城网站搭建
  • 建设网站有哪些术语游戏网站建设收费明细
  • 杭州市建设信用网站比较好的海报设计网站
  • 珠海选车牌号网站系统24小时妇科免费问医生
  • 佛山网站建设公司怎么选seo是什么意思广东
  • 莞城网站仿做杭州百度快照推广
  • 如何使用win2008iis建设网站一个电脑建设多个网站
  • 吉林做网站优化企业网站建立要做的准备
  • 什么伪原创网站好阿里云网页版入口
  • 网站链接跳转怎么做seo描述是什么
  • 江西响应式网站建设网站seo啥意思怎么做