目录
编译器三级优化分别优化了哪些?
第一级:代码调整
代码调整是一种局部的思维方式;基本上不触及算法层级;它面向的是代码,而不是问题; 所以:语句调整,用汇编重写、指令调整、换一种语言实现、换一个编译器、循环展开、参数传递优化等都属于这一级; 这个级别的优化需要掌握大量的小的优化技巧和知识,需要不断的积累;
简单的语句调整、公共表达式提取、废代码删除等当前的很多编译器也能做到了,但也需要了解一些编译器的优化能力使自己的代码配合编译器做好优化; 用汇编重写并不是简单把高级语言改写为汇编实现,那样写的汇编很可能没有当今的编译器产生的代码好,所以如果决定用汇编实现,那就应该按照汇编的角度来规划自己的实现,适当的参考编译器生成的汇编码也是可取的(特别是新手,我也一样);在某些领域,使用CPU的新特性和新的指令集等将产生巨大的性能收益,这些地方经常采用汇编来实现。
第二级:新的视角
新的视角强调的重点是针对问题的算法;即选择和构造适合于问题的算法;(冒泡排序还是快排的选择问题是这一级早就应该完成的)很多经典算法都对问题作了一些假设(包括我们当前已经完成的算法实现),而在面对实际问题时“新的视角”提示我们应该重新检视这些假设,并尝试不同的思考问题的角度,寻求适合于问题的新算法; 发掘问题的本来意义,从不同的角度思考面对的问题,使用适合于问题的的算法; 尝试打破一些规则,发掘和怀疑自己的某些假定,恢复问题的本来面目。
第三级:表驱动状态机
将问题抽象为另一种等价的数学模型或假想机器模型,比如构造出某种表驱动状态机;这一级其实是第二级的延伸,只是产生的效果更加明显,但它有其本身的特点(任何算法和优化活动都可以看作是他的投影);这一级一般可以产生无与伦比的快速程序, 要达到这一级需要大量修炼的;并且思考时必须放弃很多已有的概念或者这些概念不再重要,比如:变量、指针、空间、函数、对象等,剩下的只应该是那个表驱动状态机; 我想把这种境界描述为:空寂中,一些输入驱动着一个带有状态的机器按设定好的最短路线运转着;除此之外have nothing; 既:把解决一个问题的算法看作一个机器,它有一些可变的状态、有一些记忆、有一些按状态运行的规则,然后一些输入驱动这个机器运转;这就是第三级要求的思考优化问题的切入点,也就是寻找一部机器,使它运行经过的路径最短(可能是速度也可能是空间等等)
总结gcc静态库和动态库的制作
静态库
1.创建
首先对c文件进行gcc -c 源文件.c 生成 .o文件
ar rcs lib+名称.a .o文件
2.使用
gcc main.c lname(文件的名称需要去掉lib) -L(指在当前路径下)
动态库
1.创建
gcc -shared-fPIC-o 库名.so 源文件.c
2.使用
gcc 源文件.c./ 库名.so-o 可执行文件名
总结CMake用法
基本结构
依赖CMakeLists.txt文件,项目主目标一个,主目录中可指定包含的子目录;
在项目CMakeLists.txt中使用project指定项目名称,add_subdirectory添加子目录;
子目录CMakeLists.txt将从父目录CMakeLists.txt继承设置(TBD,待检验)
语法
#注释
变量:使用set命令显式定义及赋值,在非if语句中,使用KaTeX parse error: Expected 'EOF', got '#' at position 58: …nd (args ...) #̲命令不分大小写,参数使用空格分…{var}) <=> Add_executable(a b c) #变量使用${xxx}引用
条件语句
if(var) #var 非empty 0 N No OFF FALSE… #非运算使用NOT;
else()/elseif() … endif(var)
循环语句
WHILE() … ENDWHILE()
内部变量
CMAKE_C_COMPILER:指定C编译器;
CMAKE_CXX_COMPILER:
CMAKE_C_FLAGS:编译C文件时的选项,如-g;也可以通过add_definitions添加编译选项;
EXECUTABLE_OUTPUT_PATH:可执行文件的存放路径;
LIBRARY_OUTPUT_PATH:库文件路径
内置变量的使用
在CMakeLists.txt中指定,使用set;
cmake命令中使用,如cmake -DBUILD_SHARED_LIBS=OFF
命令
project (HELLO) #指定项目名称,生成的VC项目的名称;
include_directories:指定头文件的搜索路径,相当于指定gcc的-I参数;
link_directories:动态链接库或静态链接库的搜索路径,相当于gcc的-L参数;
add_subdirectory:包含子目录;
add_executable:编译可执行程序,指定编译,好像也可以添加.o文件;
add_definitions:添加编译参数;
target_link_libraries:添加链接库,相同于指定-l参数;
项目开发日报表
今日进度以及任务 | 动态库和静态库的区别和创建,gcc、gdb、makefile的相关了解与学习 |
本日任务完成情况 | 动态库以及静态库的创建与区别已经完成,makefile的使用已经掌握并复习了前一天学习的知识并自学了更多指令 |
本日开发中出现的问题汇总 | 宏替换 包含头文件时,<>与" "的区别 |
本日未解决问题 | |
本日开发收获 | 学会了静态库与动态库的制作与使用,初步掌握了Makefile文件编写语法 |
其他 |