[转] GCC __builtin_expect的作用】的更多相关文章

http://blog.csdn.net/shuimuniao/article/details/8017971 将流水线引入cpu,可以提高cpu的效率.更简单的说,让cpu可以预先取出下一条指令,可以提供cpu的效率.如下图所示: +-------------------------------- |取指令 | 执行指令 | 输出结果 +-------------------------------- |             | 取指令     | 执行 +----------------…
https://blog.csdn.net/shuimuniao/article/details/8017971 #define LIKELY(x) __builtin_expect(!!(x), 1) //x很可能为真 #define UNLIKELY(x) __builtin_expect(!!(x), 0) //x很可能为假 CurrentThread.h namespace CurrentThread { // internal extern __thread int t_cachedT…
如果你的程序中使用dlopen.dlsym.dlclose.dlerror 显示加载动态库,需要设置链接选项 -ldl 加载动态链接库,首先为共享库分配物理内存,然后在进程对应的页表项中建立虚拟页和物理页面之间的映射. 你可以认为系统中存在一种引用计数机制, 每当一个进程加载了共享库(在该进程的页表中进行一次映射),引用计数加一: 一个进程显式卸载(通过dlclose等)共享库或进程退出时,引用计数减 一, 当减少到0时,系统卸载共享库. (1)打开动态链接库:dlopen,函数原型void *…
编译器方面的几个命令 gcc/g++ 一. 常用编译命令选项 常用用法 gcc -Wall test.c -o test gcc编译过程 .c ->(-E)-> .i[中间文件] ->(-S)-> .s(汇编文件) ->(-c)-> .o[机器语言文件] -> 1. 无选项编译链接 > 用法: gcc test.c > 作用:将test.c预处理.汇编.编译并链接形成可执行文件.这里未指定输出文件,默认输出为a.out. 2. 选项 -o 第四步 链接…
一. gcc常用编译命令选项 假设源程序文件名为test.c. 1. 无选项编译链接 用法:#gcc test.c 作用:将test.c预处理.汇编.编译并链接形成可执行文件.这里未指定输出文件,默认输出为a.out. 2. 选项 -o 用法:#gcc test.c -o test 作用:将test.c预处理.汇编.编译并链接形成可执行文件test.-o选项用来指定输出文件的文件名. 3. 选项 -E 用法:#gcc -E test.c -o test.i 作用:将test.c预处理输出test…
一.error: 'for' loop initial declarations are only allowed in C99 mode 前段时间写了一个小C程序,放在linux下用gcc编译出错,弹出以下错误: 百度后才知道,是gcc的模式问题. 我在for循环里习惯直接定义并初始化变量来使用: for(int i=0:i<length: i++) 而在gcc编译时是错误的,应该在循环外定义变量: int i; for(i = 0; i<length; i++) 这样才编译通过. 这是因为…
今天突然被同事问道一个GCC编译命令为的问题,感觉对相应内容生疏了,赶紧整理下相关内容,梳理下相关知识. GCC命令提供了非常多的命令选项,但并不是所有都要熟悉,初学时掌握几个常用的就可以了,到后面再慢慢学习其它选项,免得因选项太多而打击了学习的信心. 一. 常用编译命令选项 假设源程序文件名为test.c. 1. 无选项编译链接用法:#gcc test.c作用:将test.c预处理.汇编.编译并链接形成可执行文件.这里未指定输出文件,默认输出为a.out. 2. 选项 -o用法:#gcc te…
在Ubuntu下安装GCC和其他一些Linux系统有点不一样. 方法一: 该方法超简单:sudo apt-get  build-depgcc 就上面这条命令就可以搞定 方法二:sudo apt-get  install  build-essential 还是简单,一句命令也可以搞定 安装完了可以执行gcc--version 的命令来查看版本,输出如下: gcc(GCC)4.2.3(Ubuntu4.2.3-2ubuntu7)Copyright(C)2007FreeSoftwareFoundatio…
1.//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// linux下c编程起步一:掌握gcc基本用法 初学时最好从命令行入手,…
引用:http://developer.51cto.com/art/200609/32317_1.htm 对于GUN编译器来说,程序的编译要经历预处理.编译.汇编.连接四个阶段 假设源程序文件名为test.c. 一.基本命令 1. 无选项编译链接用法:gcc test.c作用:将test.c预处理.汇编.编译并链接形成可执行文件.未指定输出文件则默认输出 a.out. 2. 选项 -o用法:gcc test.c -o test作用:将test.c预处理.汇编.编译并链接形成可执行文件test.-…
一. 常用编译命令选项 源程序test.c 1. 无选项编译链接用法:#gcc test.c作用:将test.c预处理.汇编.编译并链接形成可执行文件.这里未指定输出文件,默认输出为a.out. 2. 选项 -o用法:#gcc test.c -o test作用:将test.c预处理.汇编.编译并链接形成可执行文件test.-o选项用来指定输出文件的文件名. 3. 选项 -E用法:#gcc -E test.c -o test.i作用:将test.c预处理输出test.i文件. 4. 选项 -S用法…
gcc/g++编译器的安装与说明 1.gcc/g++编译器的安装 gcc yum install gcc g++ yum install gcc-c++ 2.gcc/g++的作用 将c/c++源代码编译成机器可识别的代码(指令) 3.编译过程 预处理 通过预处理指令所包含的文件内容插入程序中(展开源文件的所有代码) gcc -E test.c -o test.i 产生一个预处理后的文件( .i文件 ) 编译 语法语义纠错,调用汇编程序生成成汇编代码 编译时指定源程序,不用任何选项,会默认生成一个…
由于没有上过Linux编程这门课,所以Linux学得很水啊!!用来用去都是ls -al ; cd .. ;这些渣命令,尤其gcc都不知道什么东西来的,所以先学一下吧. 一.程序的编译过程 对于GUN编译器来说,程序的编译要经历预处理.编译.汇编.连接四个阶段,如下图所示: 在 预处理阶段,输入的是C语言的源文件,通常为*.c.它们通常带有.h之类头文件的包含文件.这个阶段主要处理源文件中的#ifdef. #include和#define命令.该阶段会生成一个中间文件*.i,但实际工作中通常不用专…
"人多不足以依赖,要生存只有靠自己." -- 拿破仑 gcc是什么:-------------------------- Linux系统下的Gcc(GNU C Compiler)是GNU推出的功能强大.性能优越的多平台编译器,是GNU的代表作品之一.gcc是可以在多种硬体平台上编译出可执行程序的超级编译器,其执行效率与一般的编译器相比平均效率要高20%~30%. Gcc编译器能将C.C++语言源程序编译.连接成可执行文件,如果没有给出可执行文件的名字,gcc将生成一个名为a.out的文…
GCC 编译器在编译一个C语言程序时需要经过以下 4 步: 将C语言源程序预处理,生成.i文件. 预处理后的.i文件编译成为汇编语言,生成.s文件. 将汇编语言文件经过汇编,生成目标文件.o文件. 将各个模块的.o文件链接起来生成一个可执行程序文件. GCC 编译流程如下图所示: .i文件..s文件..o文件可以认为是中间文件或临时文件,如果使用 GCC 一次性完成C语言程序的编译,那么只能看到最终的可执行文件,这些中间文件都是看不到的,因为 GCC 已经经它们删除了. 当然,可以使用 GCC…
昨天在自己的CentOs7.1上写makefile的时候,发现在一个C程序在编译并链接一个已生成好的lib动态库的时候出错.链接命令大概是这样的: [root@typecodes tcpmsg]# gcc -o hello main.c -lmyhello /usr/bin/ld: cannot find -lmyhello collect2: error: ld returned 1 exit status 1 gcc链接动态库时的搜索路径 自以为在当前工程中设置好了环境变量 LD_LIBRA…
安装gcc: 1.使用 yum -list gcc* 查询 centos 官方gcc的所有包: 可安装的软件包 gcc.x86_64 gcc-c++.x86_64 gcc-gfortran.x86_64 gcc-gnat.x86_64 gcc-go.x86_64 gcc-objc.x86_64 gcc-objc++.x86_64 gcc-plugin-devel.x86_64 2.根据需要安装包,编辑c , c++ 需要安装  gcc.x86_64  和   gcc-c++.x86_64 yum…
这篇文章我要简单地讲解下c++对象的内存布局,虽然已经有很多很好的文章,不过通过实现发现有些地方不同的编译器还是会有差别的,希望和大家交流. 在没有用到虚函数的时候,C++的对象内存布局和c语言的struct是一样的,这个比较容易理解,本文只对有虚函数的情况作分析,大致可以从以下几个方面阐述, 1. 单一继承 2. 多重继承 3. 虚继承 下面循序渐进的逐个分析,环境是ubuntu 12.04.3 LTS+gcc4.8.1 单一继承 为了实现运行时多态,虚函数的地址并不能在编译期决定,需要运行时…
1.       安装Ubuntu. 2.       安装gcc 方法一: sudo apt-get  install  build-essential 安装完了可以执行 gcc--version的命令来查看版本,输出如下: gcc(GCC)4.2.3(Ubuntu4.2.3-2ubuntu7) Copyright(C)2007FreeSoftwareFoundation,Inc. 编译则使用Ubuntu gcc命令.要往下学习首先就得熟悉gcc命令的用法. Ubuntu gcc命令提供了非常…
Linux提供了一套API来动态装载库.下面列出了这些API: - dlopen,打开一个库,并为使用该库做些准备.- dlsym,在打开的库中查找符号的值.- dlclose,关闭库.- dlerror,返回一个描述最后一次调用dlopen.dlsym,或dlclose的错误信息的字符串. C语言用户需要包含头文件dlfcn.h才能使用上述API.glibc还增加了两个POSIX标准中没有的API:- dladdr,从函数指针解析符号名称和所在的文件.- dlvsym,与dlsym类似,只是多…
最近有个项目用到openssl,于是去openssl的官方网站上下载了最新的版本,v1.1.1b版本. 解压之后,发现配置编译,可以使用./config或者./Configure来完成. 网上也查了一些交叉编译的说明,经常在config之后,还要手动的修改makefile才行.这种就对我这种需要维护N种交叉编译环境的人来说,就比较头疼了. 按常理讲,openssl这种用途如此广的开源库,在交叉编译应该做得很好才对啊! 打开config脚本,查找了一下,其交叉编译是可以配置的,不需要配置之后,再手…
吴迪.2010.1 北京航空航天大学出版社   Qt资源 CSDN QT http://bbs.csdn.net/forums/Qt/ QT编程网 http://www.qtbcw.com/ 编程论坛 http://bbs.bccn.net/forum-253-1.html Qter http://www.qter.org/ opensource http://qt-apps.org/ 10086 http://dev.10086.cn/cmdn/wiki/index.php?doc-view-…
上次问题(见http://www.cnblogs.com/yvivid/p/3546649.html),.depend信息路径错误的问题. 主要尝试了,在(虚拟机下构建)linux下编译,确实没有问题了.(工具链需要改为linux程序) 但回头看来,好像忽视了什么. 对于rules.mk更多的关注了gcc工具,即gcc -M的作用,忽视了 代码中 sed的作用. _depend: $(obj).depend $(obj).depend: $(src)Makefile $(TOPDIR)/conf…
void *dlopen(const char *filename, int flag); //打开一个动态链接库,并返回动态链接库的句柄 char *dlerror(void); void *dlsym(void *handle, const char *symbol); //根据动态链接库操作句柄与符号,返回符号对应的地址 int dlclose(void *handle); glibc还增加了两个POSIX标准中没有的API: dladdr,从函数指针解析符号名称和所在的文件 dlvsym…
概览: cmd常用命令配合使用: del 删除指定文件 同erase cls 清屏 rd 删除空目录文件夹 dir 显示目录 cd 在当前盘符跳转指定目录(不同盘符跳转用盘符号)(分别表示根目录 上一目录 本目录的控制符(/ ../  ./)); Visual Stdio 中的 C/C++ CL编译器: 编译连接一步到位命令生成test.exe cl test.cpp 常用配合命令: cl /c test.cpp 生成目标文件.obj: cl /out:name test.cpp      定输…
Q1:线上问题的process 都为release版本!不带调试信息怎么查?(目前有时需要查线上问题, 不得不解决这个问题) 之前查问题都是编译环境编译一个带有debug信息的版本进行替换来调试,但是这是对必现问题,使用gdb调试没问题,如果是非必现问题呢?替换进程重新运行现象就会消失! 解决方法:使用objcoy将信息表分离, 在打包环境编译进程时, makefile 中加入 -ggdb -O0 编译完成后使用objcopy 分离出调试信息, 然后strip 掉debug信息. objcopy…
智能指针笔记 GCC的原子操作函数 将流水线引入cpu,可以提高cpu的效率.更简单的说,让cpu可以预先取出下一条指令,可以提供cpu的效率.如下图所示: 取指令 执行指令 输出结果 取指令 执行 可见,cpu流水钱可以减少cpu等待取指令的耗时,从而提高cpu的效率.如果存在跳转指令,那么预先取出的指令就无用了.cpu在执行当前指令时,从内存中取出了当前指令的下一条指令.执行完当前指令后,cpu发现不是要执行下一条指令,而是执行offset偏移处的指令.cpu只能重新从内存中取出offset…
在 GCC 手册中对 __builtin_expect() 的描述是这样的: 由于大部分程序员在分支预测方面做得很糟糕,所以 GCC 提供了这个内建函数来帮助程序员处理分支预测,优化程序.其第一个参数 exp 为一个整型表达式,这个内建函数的返回值也是这个 exp ,而 c 为一个编译期常量.这个函数的语义是:你期望 exp 表达式的值等于常量 c ,从而 GCC 为你优化程序,将符合这个条件的分支放在合适的地方.一般情况下,你也许会更喜欢使用 gcc 的一个参数 '-fprofile-arcs…
我的博客:www.while0.com -fomit-frame-pointer选项是发布产品时经常会用到的优化选项,它可以优化汇编函数中用edp协助获取堆栈中函数参数的部分,不使用edp,而是通过计算,全部使用esp来完成.看下边的例子就明白了: 把一下文件保存为test.c int b(int c){ int d = c; return 0; } 通过一下命令编译: gcc -o test.s -S test.c   不优化,编译为test.s gcc -o test1.s -S -fomi…
在makefile中经常会看到这些选项,gcc默认会在程序当前目录.path路径中查找所需要的材料 如何给gcc添加我们自己的原材料(头文件,库等) -I (注意是大写的i) 给gcc添加自定义的头文件的路径 例如:我的头文件目录是myinclude -Imyinclude -L 给gcc添加额外的搜索库的路径 例如 :有一个库A所在的路径是目录B -LB -l(小写的L) 给gcc 指定具体的库 例如:gcc需要一个库A -lA 整体举例: CC=g++ CFLAGS=-g BIN=main…