静态库开发
静态库与动态库的区别
静态库:在链接时,静态库的对象文件直接加入到目标文件中,生成可执行文件。运行时不需要加载静态库。
动态库:在链接时,只有动态库的引用加入到目标文件中,生成可执行文件。运行时需要加载动态库,然后调用动态库中的函数。
静态库文件扩展名为 .a ,动态库文件扩展名为 .so (Linux)或 .dll (Windows)。
静态库在编译和链接时 resolved,动态库在运行时 resolved。
静态库会增加程序的体积,而动态库可以被多个程序共享,减小体积。
静态库:在链接时,静态库的对象文件直接加入到目标文件中,生成可执行文件。运行时不需要加载静态库。
动态库:在链接时,只有动态库的引用加入到目标文件中,生成可执行文件。运行时需要加载动态库,然后调用动态库中的函数。
静态库文件扩展名为 .a ,动态库文件扩展名为 .so (Linux)或 .dll (Windows)。
静态库在编译和链接时 resolved,动态库在运行时 resolved。
静态库会增加程序的体积,而动态库可以被多个程序共享,减小体积。
动态库是一种可以在程序运行时被动态加载的共享库,它包含了一组函数和数据,可以被多个程序共享使用,在C/C++代码重用和模块化开发中有着广泛的应用。动态库通常采用共享对象文件(.so)或者动态链接库文件(.dll)的格式存储在磁盘上。本文将介绍动态库的开发方法以及注意事项,帮助了解如何编写高质量的动态库。
编写要导出的函数时,需要使用特殊的关键字和修饰符来标识它们是动态库的导出函数。
例如,在Linux系统下,可以使用__attribute__((visibility("default")))修饰符来标识:
C++作为一门编程语言,相对于Java和JavaScript来说,就业方向是很不确定的。
虽然C++的应用方向非常广泛,涵盖数据库、自动驾驶、量化交易、高性能计算、嵌入式开发、音视频开发、QT开发、图像处理、游戏开发等许多领域,但实际上,每个方向的C++岗位都不算多。
这些C++方向除了使用C++语言之外,实际上没有太多的交集与相同点。它们分属不同的行业与技术领域,在工程实践中涉及的技能与知识也大相径庭。因此,一名在某一方向,例如游戏开发,有相当工作经验的 C++工程师,未必能很快地切换到另一方向,如嵌入式开发,并快速达到同等工作能力。不同方向的学习成本与切换成本也会较高,切换方向很可能降低涨薪幅度,从而降低了C++工程师的职业流动性。
CMake是一个跨平台的管理源代码构建的工具。最初CMake被设计为的Makefile的生成器,现在CMake也可以生成现代的构建系统,如Ninja以及Visual Studio和Xcode等IDE的项目文件。CMake被广泛用于C和C++语言,也可以用于构建其他语言的源代码。
CMakeLists.txt 是 CMake 的配置文件,用于定义项目的源代码、依赖项和构建选项。在编写 CMakeLists.txt 文件时,通常需要包括以下几个部分:
C++中的shared_ptr是一种智能指针,它是通过引用计数来管理动态内存的。shared_ptr的实现过程可以简单地概括为以下几个步骤:
创建一个shared_ptr对象时,它会初始化一个引用计数,该计数初始化为1,并将指针指向动态内存。
当一个shared_ptr对象被复制时,它的引用计数会增加1。这是通过将新的shared_ptr对象的引用计数指向原始对象的引用计数来实现的。
当一个shared_ptr对象被销毁时,它的引用计数会减少1。如果引用计数变为0,则意味着没有任何shared_ptr对象引用该动态内存,此时会自动释放该动态内存。
当一个shared_ptr对象被赋值给另一个shared_ptr对象时,它们共享同一个引用计数。这是通过将两个shared_ptr对象的引用计数指向同一个对象来实现的。
C++标准库中的list是一个双向链表,可以支持在任意位置插入和删除元素,并且具有快速的插入和删除效率。
与vector相比,list的主要区别在于:
存储结构:vector采用连续的内存空间存储元素,而list采用链式结构存储元素。
随机访问:vector支持随机访问,可以通过下标访问元素;而list不支持随机访问,只能通过迭代器遍历元素。
插入和删除:vector在末尾插入和删除元素的效率很高,但在中间插入和删除元素时效率较低,因为需要移动其他元素;而list在任意位置插入和删除元素的效率都很高,因为只需要修改相邻节点的指针。
内存分配:vector在内存空间不足时会自动扩容,会重新分配一块更大的内存空间,并将原有元素复制到新的内存空间中;而list的内存分配是动态的,每次插入一个元素都会分配一块新的内存空间。
设计模式(Design Patterns),就是设计过程中可以反复使用的、可以解决特定问题的设计方法。
在 1994 年,由 Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides 四人合著出版了一本名为 Design Patterns - Elements of Reusable Object-Oriented Software(中文译名:设计模式 - 可复用的面向对象软件元素) 的书,该书首次提到了软件开发中设计模式的概念。
四位作者合称 GOF(四人帮,全拼 Gang of Four)。他们所提出的设计模式主要是基于以下的面向对象设计原则:对接口编程而不是对实现编程,优先使用对象组合而不是继承。
C++标准库中的vector是一个动态数组,具有自动扩容的功能。它的实现原理可以分为以下几个方面:
内存分配:vector使用new运算符来分配内存,同时在析构函数中使用delete[]运算符来释放内存。vector在内存空间不足时会自动扩容,扩容时会重新分配一块更大的内存空间,并将原有元素复制到新的内存空间中。
元素访问:vector支持随机访问,可以通过下标访问元素。vector内部使用一个指针来指向第一个元素的内存地址,通过指针加上下标的偏移量来访问指定元素的内存地址。
元素插入和删除:vector支持在末尾添加元素和删除末尾元素。在插入元素时,如果vector的内存空间不足,vector会自动扩容,并将新元素插入到末尾;在删除元素时,vector会调用元素的析构函数来销毁元素,并将size减1。
迭代器:vector支持迭代器,可以使用迭代器来遍历vector中的元素。vector的迭代器类型是指向元素的指针。
内存分配策略:为了提高vector的性能,C++标准库中的vector通常采用了一些内存分配策略,例如预分配内存空间、空间复用、指针交换等。这些策略可以减少内存分配和复制的次数,提高vector的效率。