做一个旅游网站,厦门孚珀科技 网站开发,js统计网站访问人数,站群cms文章目录变量的声明和定义的区别内存泄露是什么意思#xff1f;怎么避免内存泄露怎么排查内存泄漏#xff0c;遇到内存泄漏情况#xff0c;一般怎么解决说一下define和const的区别define和typedef的区别宏函数和内联函数的区别类和结构体的区别结构体(struct)和联合体(union…文章目录变量的声明和定义的区别内存泄露是什么意思怎么避免内存泄露怎么排查内存泄漏遇到内存泄漏情况一般怎么解决说一下define和const的区别define和typedef的区别宏函数和内联函数的区别类和结构体的区别结构体(struct)和联合体(union)差别静态库和动态库区别介绍一下C的编译过程变量的声明和定义的区别变量的声明是告诉编译器变量的名称和类型不分配存储空间变量的定义会为变量分配存储空间并建立实体。一个变量可以在多个地方声明但只能在一个地方定义。 使用extern修饰的变量通常是声明表示该变量在其它文件中定义但 如果 extern 变量带初始化则该语句仍然属于定义。内存泄露是什么意思怎么避免内存泄露内存泄漏是指程序在动态申请内存后后续失去对该内存的控制导致这块内存无法被释放从而造成内存资源浪费的现象。内存被申请了却释放不了。内存泄漏的危害如下程序内存占用不断增大导致系统可用内存减少性能下降。严重时可能导致程序崩溃。服务长期运行最终会导致宕机。常见避免内存泄漏的方案RAII(资源获取即初始化)使用对象生命周期自动管理资源。尽量使用智能指针/STL容器代替裸指针。new/delete,malloc/free保证成对出现。delete将指针置空。怎么排查内存泄漏遇到内存泄漏情况一般怎么解决通过监控系统观察系统中运行中内存是否持续上涨且无法回落。其次在测试环境稳定复现使用专业工具例如Valgrind定位内存泄漏位置。结合工具日志代码找到发生内存泄漏的原因。根据具体问题修复内存泄漏代码。修复问题在测试环境进行回归测试观察问题是否解决。说一下define和const的区别编译阶段define预处理阶段直接进行文本替换。const编译阶段参与语义分析和类型检查.安全性define定义的宏变量没有数据类型只是进行简单的替换不会进行类型安全的检查。const定义的常量是有类型的会进行类型判断。相对可以避免出现错误。内存占用define定义的宏常量在程序中使用多少次就会进行多少次替换内存中有多个备份占用的是代码段的内存const定义常量占用静态存储区域的空间程序运行过程中只有一份。调式define定义的宏常量不能调试因为在预编译阶段就已经进行替换了const定义的常量可以进行调试。define和typedef的区别原理define 作为预处理指令,在编译预处理时进行替换操作,不作正确性检查,只有在编译已被展开的源程序时才会发现可能的错误并报错。typedef 是关键字,在编译时处理,有类型检查功能,用来给一个已经存在的类型一个别名。功能typedef用来定义类型别名方便使用。define不仅可以为类型取别名(替换文本方式不推荐使用这个方式)还可以定义常量。作用域define没有作用域限制。typedef有自己的作用域。安全性由于类型检查差异define安全性较低typedef较高。宏函数和内联函数的区别实现原理宏函数是在预处理阶段进行纯文本替换不参与编译阶段的语法分析和类型检查。内联函数在编译阶段由编译器进行函数展开优化参与完整的语法分析和类型检查。类型检查和安全性: 宏函数没有类型检查参数只是字符串替换容易产生类型错误和隐藏 bug。内联函数有完整的类型检查参数类型受编译器约束安全性高。参数求值次数宏函数参数可能被多次展开、多次求值容易引发副作用问题。内联函数参与只会求值一次行为和普通函数一致。作用域宏函数没有作用域限制这也可能造成污染命名空间命名冲突出现。内联函数遵循c作用域规则可以位于命名空间、类内部可控。调试宏函数预处理后消失无法设置断点调试困难。内联函数支持调试和单步追踪。类和结构体的区别默认访问权限结构体的成员默认访问权限都是public,结构体成员外部可以直接访问。类的成员默认是private意味着默认外部不能直接访问。继承类可以通过继承实现子类与父类之间的关系可以使用公共、保护或私有继承来控制成员的访问权限。-结构体也可以继承但由于其成员默认是公共的继承可能导致访问权限问题。设计理念类强调 封装、抽象和对象行为适合面向对象建模。结构体强调 数据聚合适合描述简单数据结构。使用场景类适用于复杂对象、业务逻辑封装和接口抽象。结构体用于定义简单数据结构、配置数据等。结构体(struct)和联合体(union)差别内存存储方式union所有成员共享同一块内存。struct每个成员拥有独立的内存空间有效成员个数union同一时刻只有一个成员有效struct所有时刻所有成员始终有效。成员赋值影响union给某一个成员赋值时会覆盖其它成员的内容。struct给某个成员赋值时不会影响其它成员。内存占用union大小大于等于最大成员的大小并满足最大对齐要求。struct大小等于各成员大小之和对齐填充字节。静态库和动态库区别链接时机静态库在编译链接阶段被拷贝进可执行文件程序运行时不再依赖库文件。动态库在程序运行时加载可执行文件中只保存符号引用不包含库代码。内存占用静态库每个进程各自加载一份库代码内存占用大。动态库多个进程共享同一份库代码内存占用小。运行依赖静态库不依赖外部库文件可独立运行。动态库依赖外部动态库文件部署时必须保证库存在。运行效率静态库函数调用由于少一次间接跳转函数调用略快。可拓展性动态链接库的可扩展性更好,可以在不修改可执行文件的情况下替换或添加新的库文件,而静态链接库需要重新编译链接。介绍一下C的编译过程C编译过程经过预处理、编译、汇编和链接四个主要阶段预处理对源代码进行处理,主要包括展开宏定义、处理条件编译指令(如#include、#define、#ifdef等)以及删除注释等。预处理的结果是生成一个经过宏展开和条件处理后的纯C源代码文件。编译将预处理后的源代码翻译为汇编语言,生成汇编代码。编译器会进行词法分析、语法分析和语义分析,检查代码的正确性,并生成中间代码表示。汇编将汇编代码转换为机器可以执行的目标文件。汇编器会将汇编代码转化为机器指令,并生成与机器硬件平台相关的目标文件。链接: 将目标文件与其他必要的库文件链接在一起,生成可执行程序。链接器会解析目标文件中的符号引用,将其与其他目标文件或库文件中的符号定义进行匹配,最终生成一个完整的可执行文件。在链接阶段,还会进行地址重定位、符号解析、符号表生成等操作,确保程序的正确执行。