![](https://img-blog.csdnimg.cn/20201014180756757.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++
文章平均质量分 84
恒友成
勿在浮沙筑高台
左脑学习,右脑应用
展开
-
34.extern C的作用
欢迎访问个人网络日志🌹🌹🌹🌹。原创 2024-06-18 00:35:10 · 436 阅读 · 0 评论 -
33.perf工具使用
Perf(Performance Counters for Linux,性能计数器子系统)是一个Linux性能分析工具,用于分析系统和应用程序的运行时性能。这个工具位于Linux内核源代码树中,具体位置在tools/perf目录下。虽然它是一个用户空间的应用程序,但却是唯一一个被包含在Linux内核源码中的复杂用户软件。Perf可以帮助开发人员和系统管理员进行函数级和指令级的热点查找,可以用来分析程序中热点函数的CPU占用率,了解CPU。原创 2024-05-26 15:01:38 · 735 阅读 · 0 评论 -
32.strace/ltrace命令及其使用
strace是一个强大的工具,用于跟踪程序执行时的系统调用和接收到的信号。通过strace,可以了解程序在运行时请求了哪些系统调用,这些调用的参数是什么,以及操作系统对这些调用的响应。这对于调试程序、分析程序行为和优化性能非常有用。诊断程序错误:通过分析程序与操作系统之间的交互,可以帮助找到错误和异常的原因性能分析:通过查看系统调用的时间、数量和类型,可以识别潜在的性能瓶颈安全分析:检查程序是否进行恶意行为,如不当访问文件、套接字等。原创 2024-05-25 01:06:32 · 465 阅读 · 0 评论 -
31.GDB介绍及简单使用
命令运行程序,当程序运行到断点处时,程序会自动停止。命令可以直接运行程序,也可以调试程序,在运行程序时,可以通过。可以同时查看源码,汇编代码和控制调试指令输入。命令运行程序,在调试程序时,可以通过。GNU GPL`协议公开发布。的时候可以借助文本用户界面。来提升代码调试的体验。欢迎访问个人网络日志🌹🌹。查看当前函数的汇编代码。原创 2024-05-24 22:45:27 · 505 阅读 · 0 评论 -
30.静态代码分析工具clang-tidy
clang-tidy是一个基于 clang 的 C++ “linter” 工具。其作用主要是用来检查和修正代码中的典型编程问题,像代码风格/接口误用/通过静态分析可定位到的bug。clang-tidy模块化功能做的很好,有预留接口,非常便于实现新的代码检查功能。原创 2024-05-21 23:13:37 · 742 阅读 · 0 评论 -
29.LLVM及Clang介绍
和GCC一样,LLVM也是编译器,GCC是由GNU开发的编程语言编译器,是GNU项目的关键部分,也是自由的类Unix及苹果电脑Mac OS X操作系统的标准编译器。LLVM本身不是缩略词,项目的名称就叫这个。该项目于2000年由美国伊利诺伊大学厄巴纳-香槟分校的和发起的,他们的目标在于提供一种基于静态单赋值SSA现代编译策略能够支持任意编程语言的静态和动态编译的工具。LLVM首次发布是在2003年。原创 2024-05-19 23:48:52 · 937 阅读 · 0 评论 -
28.C++加速编译工具ccache
ccache是一个编译器缓存工具,它通过缓存之前的编译结果来加速重新编译的过程。当再次进行相同的编译时,ccache可以检测到并直接从缓存中获取结果,从而避免了重复的编译过程。支持GCC、Clang、MSVC(Microsoft Visual C++)等类似的编译器3。在Linux、macOS、其他类Unix操作系统以及Windows上工作。理解C、C++、汇编器、CUDA、Objective-C和Objective-C++。原创 2024-05-17 22:35:27 · 733 阅读 · 0 评论 -
27.STL vector容器emplace_back和push_back的区别
C++标准库提供了函数,可以直接调用对像的构造函数,避免不必要的复制和移动。原创 2024-05-16 23:42:27 · 252 阅读 · 0 评论 -
26.使用CMake和CTest组织工程测试
欢迎访问个人网络日志🌹🌹🌹🌹。原创 2024-05-12 23:05:42 · 735 阅读 · 0 评论 -
26.ELF文件解析
欢迎访问个人网络日志🌹🌹🌹🌹ELF(Executable and Linked Format)是UNIX系统实验室(USL)作为应用程序二进制接口(Application Binary Interface)开发和发布的可执行链接格式。ELF文件是Linux目标文件格式既参与程序执行也参与程序链接。原创 2024-04-21 20:47:34 · 1036 阅读 · 0 评论 -
25.设置及使用coredump文件
核心转储是一个包含进程意外终止时进程内存内容的文件。核心转储由内核触发以响应程序崩溃。核心转储作为崩溃时程序状态的事后快照非常重要,特别是在故障难以重现的情况下。原创 2024-04-10 22:24:28 · 1039 阅读 · 0 评论 -
24.Linux下程序调试分析工具`Valgrind`
Valgrind是开源的Linux程序调试工具,可以用来自动检测程序中存在的内存管理,线程同步的问题,帮助开发人员提升代码调试的效率。Valgrind还可以输出程序的Profile信息,方便开发者定位程序中的性能问题。Valgrind是开源的Linux程序,开发者可以根据需要自行修改源码后编译。Valgrind支持主流的Linux系统,包括x86/Linux和。Valgrind功能强大,是大型复杂程序调试和系统profile分析的必备工具。Valgrind。原创 2024-04-09 23:17:41 · 625 阅读 · 0 评论 -
23.C++11引入的内存序
欢迎访问个人网络日志🌹🌹🌹🌹内存序是为了在做原子操作时,控制多线程间内存可见性的一种机制,从而有助于避免数据争用并确保正确同步。之所以要对原子操作的内存序做限制还是在于编译器编译时和cpu运行指令时会对指令做重排优化。这可能会导致意外的结果。关于指令乱序可以参考。c++11中引入的原子类型上的操作服从6是可选的最严格的内存次序,各种原子类型的所有操作都默认遵从该次序,除非我们特意为某项操作另行指定。内存次序共有6种,但它们只代表3。原创 2024-03-31 16:00:40 · 875 阅读 · 0 评论 -
22.C++中的原子操作
是一个模板,除了前面介绍的bool外还支持等多种类型特化。原子操作在多线程编程中是非常有用的,可以帮助我们避免很多问题,但是原子操作也有一定的代价,它可能会影响程序的性能。所以,在程序中使用原子操作时,需要根据实际情况,权衡性能与并发性的关系。欢迎访问个人网络日志🌹🌹知行空间🌹🌹。原创 2024-03-28 00:46:07 · 1020 阅读 · 0 评论 -
21.Linux进程间通信IPC之共享内存和信号量
信号量是一种用于多线程或多进程之间同步的机制。信号量(Semaphore),是在多进程环境下使用的一种设施, 它负责协调各个进程, 以保证它们能够正确、合理地使用公共资源。信号量分为单值和多值两种,单值信号量只能被一个进程获得,多值信号量后者可以被若干个进程获得。需要包含头文件信号量可以用来保证两个或多个关键代码段不会被并发调用。共享内存可以说是Linux下最快速、最有效的进程间通信方式。原创 2024-03-26 01:12:22 · 984 阅读 · 0 评论 -
20.Ubuntu下安装GCC
欢迎访问个人网络日志🌹🌹🌹🌹。原创 2024-03-24 22:11:48 · 981 阅读 · 0 评论 -
19.C++20中的std::latch和std::barrier
欢迎访问个人网络日志🌹🌹🌹🌹。原创 2024-03-21 22:22:36 · 959 阅读 · 0 评论 -
19.C++ 中将一维数组转成多维的三种方式
操作符可用于将一个指向基类的指针转换为指向子类的指针。但是这样的转换不总是安全的。reinterpret_cast作用为:允许将任何指针转换为任何其他指针类型。数组的首地址,reinterpret_cast后将这个转换结果赋值给了。它可以强制性的将一个指针类型转换成另一种不会做检查,因此就不需要先转成。的引用,如此就完成了类型转换。是取指针的值,也就是数组的首地址,类型转换是有保护的,如果同样能使用。指针中的元素个数,防止越界。欢迎访问个人网络日志🌹🌹。转换约束的限制,如果使用。是一个数组变量的引用,原创 2023-12-02 10:43:19 · 389 阅读 · 0 评论 -
18.C++中模板参数类型推断与引用
第一个编译规则,当将一个左值传递给模板函数的模板类型右值引用的参数时,编译器推断模板类型参数为实参的左值引用类型。所以调用。原创 2023-10-20 22:17:55 · 291 阅读 · 0 评论 -
17.C++类型别名之typedef 与 using
这个关键字的引人是为了满足这种情况,当希望从表达式的类型推断出要定义的变量类型,但并不想用表达式的值初始化变量的时候,会使用。因为使用派生类创建对象时,会先调用基类的构造函数再调用派生类的构造函数。不过,上面的代码就很丑了,而且还新定义了不必要的结构体,十分繁琐。方法,就需要对基类中的构造方法进行“补齐”,十分麻烦。类型的函数指针,虽然两者功能相同,但从代码看上使用。看下面这种情况,先定义了基类,又定义了派生类。来定义的话,代码在编译的时候就会报错如下,声明后,就可以在派生类中使用基类的函数了。原创 2023-07-15 15:21:38 · 760 阅读 · 0 评论 -
16.C++中的多线程
线程同步是指线程间需要按照预定的先后顺序进行的行为,比如我想要线程1完成了某个步骤之后,才允许线程2开始工作,这个时候就可以使用条件变量来达到目的。对于线程间共享的变量,进行读取和写入操作时,常用的同步方式就是加锁,但是每一次循环都要加锁解锁会导致程序开销很大。当一个线程访问时,先给该线程所获取的资源上锁,防止其他线程修改资源,一个线程访问结束时,通过解锁释放资源。原子类型是封装了一个值的类型,它的访问保证不会导致数据的竞争,并且可以用于在不同的线程之间同步内存访问。没有承诺的未来没有意义,什么都不会有。原创 2023-07-07 20:16:42 · 352 阅读 · 0 评论 -
15.C++中的RAII
在这个概念中资源所指的不仅是内存,也可以指文件描述符,套接字,数据库句柄等。资源的生命周期等同于资源对象的作用域。上面的代码中,没有做线程通步,两个线程的输出混淆在一起,这不是我们想要的结果。中,在创建一个类对象时会自动调用类的构造函数,对象超出作用域时会自动调用析构函数。等,都是在构造函数中获取资源,在析构函数中自动清除,不需要显式的清除资源。提出来的,直接翻译过来就是资源获取即初始化,是一个非常强大的编程概念。其他的诸如管理文件描述符,套接字,登陆信息的上下文等,使用。欢迎访问个人网络日志🌹🌹。原创 2023-04-19 23:16:07 · 982 阅读 · 0 评论 -
14.C++中的智能指针
创建aPtr和bPtr时,各自的引用计数会变成1,接着2个赋值语句,又把各自的引用计数加了1,就都变成了2,然后离开作用域,会减1,这样各自的引用计数还保持1,这样就无法释放内存空间,就不会去执行A和B的析构函数。智能指针与常规指针行为类似,但两者的重要区别是智能指针能自动释放他所指向的内存。返回了指向智能指针管理对象的内置指针,提供这个函数,主要是为了向不能使用智能指针的代码中传递一个内置指针。因此,在创建智能指针的时候,必须提供指针可以指向的类型。的引用计数本身是安全无锁的,但对象的读写不是,原创 2023-03-19 16:31:44 · 1157 阅读 · 0 评论 -
12.typedef的使用与结构体定义
typedef是C/C++语言中保留的关键字,用来定义一种数据类型的别名。typedef并没有创建新的类型,只是指定了一个类型的别名而已。typedef定义的类型的作用域只在该语句的作用域之内, 也就是说如果typedef定义在一个函数体内,那么它的作用域就是这个函数。如果typedef定义在一个命名空间中,则其作用域只在当前命名空间中。原创 2023-03-06 22:56:10 · 742 阅读 · 2 评论 -
13.C++中static的应用及文件包含
对比第一次报错,不加条件编译在编译时就报错,加了条件编译,编译能通过,但链接时报错。在这里注意的是,变量/函数/类/结构体的重复定义不仅会发生在源程序编译的时候,在目标程序链接的时候同样也有可能发生。原创 2023-03-18 16:59:53 · 1013 阅读 · 0 评论 -
(十一) 编译工具cmake
如前面,自定义共享库,并安装到指定目录,当想在。原创 2022-12-20 22:28:39 · 1677 阅读 · 1 评论 -
(十)C++中的左值lvalue&右值rvaue
这种需要预处理/编译/汇编/链接的翻译成机器代码的语言,变量名不需要储存,只是为了方便程序员编程,在编译器编译时会确定每个变量的地址,所有的局部变量读写都会变成(栈地址 + 偏移)的形式。如上,其实左值表示的是对象的引用,而右值正是被左值指向的对象。在定义左值引用时都是定义变量的引用,而不能定义一个指向临时数据的左值引用,这可以使用右值引用来实现。中的基本概念,简单来说,左值就是一个表达式等号左边的部分,右值就是等号右边的部分。返回引用的函数的调用产生的是左值,返回值的函数调用产生的是右值。原创 2022-11-18 21:27:46 · 632 阅读 · 0 评论 -
(九)STL之algorithm
的元素放在后面,返回值为指向第二组元素的首指针。返回容器中的元素顺序不以一定与之前相同,有可能发生变化。欢迎访问个人网络日志🌹🌹。欢迎访问个人网络日志🌹🌹。返回和输入都是迭代器。原创 2022-10-16 21:47:18 · 271 阅读 · 0 评论 -
(八)C++中的面向对象
欢迎访问个人网络日志🌹🌹。欢迎访问个人网络日志🌹🌹。原创 2022-10-16 21:43:10 · 914 阅读 · 0 评论 -
(七)C++中实现argmin与argmax
(七)C++中实现argmin与argmax原创 2022-08-28 11:52:48 · 1406 阅读 · 0 评论 -
(六)C++中的functor与lambda
c++在函数后加const的意义是,定义的类的成员函数中,常常有一些成员函数不改变类的数据成员,也就是说,这些函数是"只读"函数,而有一些函数要修改类数据成员的值。如果把不改变数据成员的函数都加上const关键字进行标识,显然,可提高程序的可读性。不过,上述的方式是通过硬编码实现的,换一个加的值就要重新写一个函数,十分不方便。不过,模板函数的方式是在编译时需要确定参数和类型,因此其必须时。类型,不能传参数进去,也就是像如下方式,程序运行时会报错。,是任何像函数一样的函数。欢迎访问个人网络日志🌹🌹。...原创 2022-08-28 11:44:10 · 555 阅读 · 0 评论 -
(五)C++中的排序函数性能比较
的源码实现中,数据量大时采用QuickSort快排算法,然后分治部分的数据量小于某个门槛(16),为避免QuickSort快排的递归调用带来过大的额外负荷,就改用Insertion Sort插入排序。如果递归层次过深,还会改用HeapSort堆排序。C++中可用的排序算法有两个,一个是。:排序数组的头元素指针,被转成了。:数组中每个元素占用字节数。欢迎访问个人网络日志🌹🌹。上面的测试是随机生成含有。元素的数组,每个方法测试。欢迎访问个人网络日志🌹🌹。万次后的平均性能,可见。...原创 2022-08-27 12:32:33 · 574 阅读 · 0 评论 -
(四)C++的常用容器简析
C++常用标准容器原创 2022-04-19 01:10:49 · 167 阅读 · 0 评论 -
(三)C++中的内存管理
C与C++中的动态内存的管理原创 2022-04-17 12:18:18 · 592 阅读 · 0 评论 -
(二)C++ variable-sized object may not be initialized
C++ variable-sized object may not be initialized原创 2022-04-16 12:46:35 · 1958 阅读 · 2 评论 -
(一)函数与指针
C++中的函数指针与指针函数原创 2022-03-20 12:12:41 · 789 阅读 · 0 评论 -
Eclipse 创建自己的Wokspace和C++ Project
(1)創建自己的工作空間打開Eclipsefile——switch——other——brose選擇創作工作空間的路徑,創建新的工作空間(2)創建新的工程通過選擇file——New——C Project/C++ Project來創建新的工程窗口選擇Executable——Empty Project——Linux GCC創建新的工程「注」(1)RemoteSystemsTe原创 2017-04-24 15:04:21 · 493 阅读 · 0 评论 -
Eclipse编译时函数报错:Undefined reference to 'pthread_create'
Eclipse + CDT:pthread_create函数编译时报错:undefined reference to `pthread_create’undefined reference to `pthread_create’undefined reference to `MD5′由于pthread 库不是 Linux 系统默认的库,连接时需要使用静态库 libpth转载 2017-05-16 21:22:51 · 2608 阅读 · 0 评论 -
C/C++的memset函数的说明和使用
1. memset()函数原型是extern void *memset(void *buffer, int c, int count) buffer:为指针或是数组, c:是赋给buffer的值, count:是buffer的长度. 这个函数在socket中多用于清空数组.如:原型是memset(buffer, 0,转载 2017-05-16 22:06:01 · 537 阅读 · 0 评论 -
Size_t
size_t unsigned int 类型,无符号,它的取值没有负数。用来表示 参数/数组元素个数,sizeof 返回值,或 str相关函数返回的 size 或 长度。sizeof 操作符的结果类型是size_t。ssize_tsize of an object or –1,long类型,有符号time_ttime of day in seco转载 2017-06-02 20:59:17 · 264 阅读 · 0 评论