跳至主要內容
静态库开发

静态库开发

静态库与动态库的区别

静态库:在链接时,静态库的对象文件直接加入到目标文件中,生成可执行文件。运行时不需要加载静态库。

动态库:在链接时,只有动态库的引用加入到目标文件中,生成可执行文件。运行时需要加载动态库,然后调用动态库中的函数。

静态库文件扩展名为 .a ,动态库文件扩展名为 .so (Linux)或 .dll (Windows)。

静态库在编译和链接时 resolved,动态库在运行时 resolved。

静态库会增加程序的体积,而动态库可以被多个程序共享,减小体积。


ekskei大约 1 分钟C/C++
动态库开发

动态库开发

动态库是一种可以在程序运行时被动态加载的共享库,它包含了一组函数和数据,可以被多个程序共享使用,在C/C++代码重用和模块化开发中有着广泛的应用。动态库通常采用共享对象文件(.so)或者动态链接库文件(.dll)的格式存储在磁盘上。本文将介绍动态库的开发方法以及注意事项,帮助了解如何编写高质量的动态库。

导出函数

编写要导出的函数时,需要使用特殊的关键字和修饰符来标识它们是动态库的导出函数。

例如,在Linux系统下,可以使用__attribute__((visibility("default")))修饰符来标识:


ekskei大约 9 分钟C/C++
关于C++就业方向

关于C++就业方向

C++作为一门编程语言,相对于Java和JavaScript来说,就业方向是很不确定的。

虽然C++的应用方向非常广泛,涵盖数据库、自动驾驶、量化交易、高性能计算、嵌入式开发、音视频开发、QT开发、图像处理、游戏开发等许多领域,但实际上,每个方向的C++岗位都不算多。

这些C++方向除了使用C++语言之外,实际上没有太多的交集与相同点。它们分属不同的行业与技术领域,在工程实践中涉及的技能与知识也大相径庭。因此,一名在某一方向,例如游戏开发,有相当工作经验的 C++工程师,未必能很快地切换到另一方向,如嵌入式开发,并快速达到同等工作能力。不同方向的学习成本与切换成本也会较高,切换方向很可能降低涨薪幅度,从而降低了C++工程师的职业流动性。


ekskei小于 1 分钟C/C++工作
CMake教程

CMake教程

CMake是一个跨平台的管理源代码构建的工具。最初CMake被设计为的Makefile的生成器,现在CMake也可以生成现代的构建系统,如Ninja以及Visual Studio和Xcode等IDE的项目文件。CMake被广泛用于C和C++语言,也可以用于构建其他语言的源代码。

CMakeLists.txt 文件的编写

CMakeLists.txt 是 CMake 的配置文件,用于定义项目的源代码、依赖项和构建选项。在编写 CMakeLists.txt 文件时,通常需要包括以下几个部分:

CMake 最低版本要求


ekskei大约 6 分钟C/C++CMake
shared_ptr智能指针

shared_ptr智能指针

C++中的shared_ptr是一种智能指针,它是通过引用计数来管理动态内存的。shared_ptr的实现过程可以简单地概括为以下几个步骤:

  1. 创建一个shared_ptr对象时,它会初始化一个引用计数,该计数初始化为1,并将指针指向动态内存。

  2. 当一个shared_ptr对象被复制时,它的引用计数会增加1。这是通过将新的shared_ptr对象的引用计数指向原始对象的引用计数来实现的。

  3. 当一个shared_ptr对象被销毁时,它的引用计数会减少1。如果引用计数变为0,则意味着没有任何shared_ptr对象引用该动态内存,此时会自动释放该动态内存。

  4. 当一个shared_ptr对象被赋值给另一个shared_ptr对象时,它们共享同一个引用计数。这是通过将两个shared_ptr对象的引用计数指向同一个对象来实现的。


ekskei大约 3 分钟C/C++指针
list的实现

list的实现

C++标准库中的list是一个双向链表,可以支持在任意位置插入和删除元素,并且具有快速的插入和删除效率。

与vector的区别

与vector相比,list的主要区别在于:

  1. 存储结构:vector采用连续的内存空间存储元素,而list采用链式结构存储元素。

  2. 随机访问:vector支持随机访问,可以通过下标访问元素;而list不支持随机访问,只能通过迭代器遍历元素。

  3. 插入和删除:vector在末尾插入和删除元素的效率很高,但在中间插入和删除元素时效率较低,因为需要移动其他元素;而list在任意位置插入和删除元素的效率都很高,因为只需要修改相邻节点的指针。

  4. 内存分配:vector在内存空间不足时会自动扩容,会重新分配一块更大的内存空间,并将原有元素复制到新的内存空间中;而list的内存分配是动态的,每次插入一个元素都会分配一块新的内存空间。


ekskei大约 3 分钟C/C++STL
设计模式

设计模式

设计模式简介

设计模式(Design Patterns),就是设计过程中可以反复使用的、可以解决特定问题的设计方法。

在 1994 年,由 Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides 四人合著出版了一本名为 Design Patterns - Elements of Reusable Object-Oriented Software(中文译名:设计模式 - 可复用的面向对象软件元素) 的书,该书首次提到了软件开发中设计模式的概念。

四位作者合称 GOF(四人帮,全拼 Gang of Four)。他们所提出的设计模式主要是基于以下的面向对象设计原则:对接口编程而不是对实现编程,优先使用对象组合而不是继承。


ekskei大约 4 分钟C/C++设计模式
vector的实现

vector的实现

原理

C++标准库中的vector是一个动态数组,具有自动扩容的功能。它的实现原理可以分为以下几个方面:

  1. 内存分配:vector使用new运算符来分配内存,同时在析构函数中使用delete[]运算符来释放内存。vector在内存空间不足时会自动扩容,扩容时会重新分配一块更大的内存空间,并将原有元素复制到新的内存空间中。

  2. 元素访问:vector支持随机访问,可以通过下标访问元素。vector内部使用一个指针来指向第一个元素的内存地址,通过指针加上下标的偏移量来访问指定元素的内存地址。

  3. 元素插入和删除:vector支持在末尾添加元素和删除末尾元素。在插入元素时,如果vector的内存空间不足,vector会自动扩容,并将新元素插入到末尾;在删除元素时,vector会调用元素的析构函数来销毁元素,并将size减1。

  4. 迭代器:vector支持迭代器,可以使用迭代器来遍历vector中的元素。vector的迭代器类型是指向元素的指针。

  5. 内存分配策略:为了提高vector的性能,C++标准库中的vector通常采用了一些内存分配策略,例如预分配内存空间、空间复用、指针交换等。这些策略可以减少内存分配和复制的次数,提高vector的效率。


ekskei大约 3 分钟C/C++STL
C++ 性能优化

C++ 性能优化

原则

  • 《More Effective C++》书中效率部分第一条就是80—20准则。说得是——大约 20%的代码使用了 80%的程序资源;大约 20%的代码耗用了大约 80%的运行时间;大约 20%的代码使用了 80%的内存。因此,一些简单的优化也能显著提高程序性能。
  • 先完成程序功能,再考虑性能优化的事,否则会出现代码可读性差,过度抽象等问题。
  • 大部分的性能优化其实都是在做时间和空间的权衡,空间换时间,或者时间换空间。
  • 良好的代码风格和代码规范能有效的避免性能问题的出现,所以code review也很重要。
  • 大幅度的提升程序性能需要借助程序分析器(profiler)寻找出程序的性能瓶颈,针对这个瓶颈进行代码层面,算法层面,架构层面等多方面的优化。

ekskei大约 2 分钟C/C++性能
C语言的内存分布

C 程序的内存分布

C 程序的典型内存由文本段、数据段、堆和栈4部分组成:

1. 文本段(Text Segment、代码段、代码区)

文本段,也称为代码段或简称为文本,是目标文件或内存中程序的一部分,其中包含可执行指令。文本段放在堆或栈的下面,以防止堆和栈溢出覆盖它。

文本段通常是可共享的,因此对于频繁执行的程序,内存中只需要一个副本。此外,文本段通常是只读的,以防止程序意外修改其指令。

2. 数据段(Data Segment、全局/静态数据段、全局/静态存储区)

分为两部分:


ekskei大约 4 分钟C/C++内存