1 什么是编译器?
不同的编译器,有不同的审查规范,也就间接导致了我们编译代码过程与结果的差异。同一行代码,在审查不严格的编译器,不会报错;在审查严格的编译器,则会报错。
常用的C语言编译器有GCC(G++)、TCC、Clang、VC++2010等。
取决于编译器的行为有很多,例如:浮点类型的舍入关系等。
编译器本质上就是把不同的.c/.cpp文件根据.h中的符号表汇总成一个可执行文件,源码有多大最终的可执行文件就有多大,但是可以通过dlopen形式调用动态链接库,这样的优点有:
在代码处使用函数标识符形式替代函数体,可缩小可执行文件的体积。
在中间件代码中,中间件涉及多平台共用场景,若某平台未添加某函数的实现,则不会导致编译问题,此条最重要。
2 软件为什么需要分层结构?
之前在做嵌入式裸机开发时,一直不理解如何分层设计,是直接调用方案商/原厂提供的库还是中间封装一层再给逻辑层使用?到底OSI七层模型为什么要搞个七层而不是直接就一层给工程师开发?如今在接触更复杂的软件系统后,逐渐明白,当某模块可独立且需要有大量独立逻辑时,才有必要针对此模块单独分层设计。只有这样,针对复杂的软件系统,可以分层给不同的开发人员做维护,各层之间再通过其他API进行传递。分层后,由于所有代码不是在一坨上,模块化设计可使代码更易于维护。
3 程序调试时最难调试的Bug?
程序调试时最大的Bug是Core dump,Core dump发生时无既定Log打印,无法排查具体位置,一般当调用接口的实现不存在时或者出现踩内存的情况时会出现Core dump。
Core dump出现的解法:
Android中可以查看bugreport文件,此文件中包含程序出问题的代码段信息。