C++
文章平均质量分 84
恒友成
勿在浮沙筑高台
左脑学习,右脑应用
展开
-
26.ELF文件解析
欢迎访问个人网络日志🌹🌹🌹🌹ELF(Executable and Linked Format)是UNIX系统实验室(USL)作为应用程序二进制接口(Application Binary Interface)开发和发布的可执行链接格式。ELF文件是Linux目标文件格式既参与程序执行也参与程序链接。原创 2024-04-21 20:47:34 · 975 阅读 · 0 评论 -
25.设置及使用coredump文件
核心转储是一个包含进程意外终止时进程内存内容的文件。核心转储由内核触发以响应程序崩溃。核心转储作为崩溃时程序状态的事后快照非常重要,特别是在故障难以重现的情况下。原创 2024-04-10 22:24:28 · 941 阅读 · 0 评论 -
24.Linux下程序调试分析工具`Valgrind`
Valgrind是开源的Linux程序调试工具,可以用来自动检测程序中存在的内存管理,线程同步的问题,帮助开发人员提升代码调试的效率。Valgrind还可以输出程序的Profile信息,方便开发者定位程序中的性能问题。Valgrind是开源的Linux程序,开发者可以根据需要自行修改源码后编译。Valgrind支持主流的Linux系统,包括x86/Linux和。Valgrind功能强大,是大型复杂程序调试和系统profile分析的必备工具。Valgrind。原创 2024-04-09 23:17:41 · 558 阅读 · 0 评论 -
23.C++11引入的内存序
欢迎访问个人网络日志🌹🌹🌹🌹内存序是为了在做原子操作时,控制多线程间内存可见性的一种机制,从而有助于避免数据争用并确保正确同步。之所以要对原子操作的内存序做限制还是在于编译器编译时和cpu运行指令时会对指令做重排优化。这可能会导致意外的结果。关于指令乱序可以参考。c++11中引入的原子类型上的操作服从6是可选的最严格的内存次序,各种原子类型的所有操作都默认遵从该次序,除非我们特意为某项操作另行指定。内存次序共有6种,但它们只代表3。原创 2024-03-31 16:00:40 · 836 阅读 · 0 评论 -
22.C++中的原子操作
是一个模板,除了前面介绍的bool外还支持等多种类型特化。原子操作在多线程编程中是非常有用的,可以帮助我们避免很多问题,但是原子操作也有一定的代价,它可能会影响程序的性能。所以,在程序中使用原子操作时,需要根据实际情况,权衡性能与并发性的关系。欢迎访问个人网络日志🌹🌹知行空间🌹🌹。原创 2024-03-28 00:46:07 · 962 阅读 · 0 评论 -
21.Linux进程间通信IPC之共享内存和信号量
信号量是一种用于多线程或多进程之间同步的机制。信号量(Semaphore),是在多进程环境下使用的一种设施, 它负责协调各个进程, 以保证它们能够正确、合理地使用公共资源。信号量分为单值和多值两种,单值信号量只能被一个进程获得,多值信号量后者可以被若干个进程获得。需要包含头文件信号量可以用来保证两个或多个关键代码段不会被并发调用。共享内存可以说是Linux下最快速、最有效的进程间通信方式。原创 2024-03-26 01:12:22 · 950 阅读 · 0 评论 -
20.Ubuntu下安装GCC
欢迎访问个人网络日志🌹🌹🌹🌹。原创 2024-03-24 22:11:48 · 621 阅读 · 0 评论 -
19.C++20中的std::latch和std::barrier
欢迎访问个人网络日志🌹🌹🌹🌹。原创 2024-03-21 22:22:36 · 884 阅读 · 0 评论 -
19.C++ 中将一维数组转成多维的三种方式
操作符可用于将一个指向基类的指针转换为指向子类的指针。但是这样的转换不总是安全的。reinterpret_cast作用为:允许将任何指针转换为任何其他指针类型。数组的首地址,reinterpret_cast后将这个转换结果赋值给了。它可以强制性的将一个指针类型转换成另一种不会做检查,因此就不需要先转成。的引用,如此就完成了类型转换。是取指针的值,也就是数组的首地址,类型转换是有保护的,如果同样能使用。指针中的元素个数,防止越界。欢迎访问个人网络日志🌹🌹。转换约束的限制,如果使用。是一个数组变量的引用,原创 2023-12-02 10:43:19 · 325 阅读 · 0 评论 -
18.C++中模板参数类型推断与引用
第一个编译规则,当将一个左值传递给模板函数的模板类型右值引用的参数时,编译器推断模板类型参数为实参的左值引用类型。所以调用。原创 2023-10-20 22:17:55 · 249 阅读 · 0 评论 -
17.C++类型别名之typedef 与 using
这个关键字的引人是为了满足这种情况,当希望从表达式的类型推断出要定义的变量类型,但并不想用表达式的值初始化变量的时候,会使用。因为使用派生类创建对象时,会先调用基类的构造函数再调用派生类的构造函数。不过,上面的代码就很丑了,而且还新定义了不必要的结构体,十分繁琐。方法,就需要对基类中的构造方法进行“补齐”,十分麻烦。类型的函数指针,虽然两者功能相同,但从代码看上使用。看下面这种情况,先定义了基类,又定义了派生类。来定义的话,代码在编译的时候就会报错如下,声明后,就可以在派生类中使用基类的函数了。原创 2023-07-15 15:21:38 · 598 阅读 · 0 评论 -
16.C++中的多线程
线程同步是指线程间需要按照预定的先后顺序进行的行为,比如我想要线程1完成了某个步骤之后,才允许线程2开始工作,这个时候就可以使用条件变量来达到目的。对于线程间共享的变量,进行读取和写入操作时,常用的同步方式就是加锁,但是每一次循环都要加锁解锁会导致程序开销很大。当一个线程访问时,先给该线程所获取的资源上锁,防止其他线程修改资源,一个线程访问结束时,通过解锁释放资源。原子类型是封装了一个值的类型,它的访问保证不会导致数据的竞争,并且可以用于在不同的线程之间同步内存访问。没有承诺的未来没有意义,什么都不会有。原创 2023-07-07 20:16:42 · 345 阅读 · 0 评论 -
15.C++中的RAII
在这个概念中资源所指的不仅是内存,也可以指文件描述符,套接字,数据库句柄等。资源的生命周期等同于资源对象的作用域。上面的代码中,没有做线程通步,两个线程的输出混淆在一起,这不是我们想要的结果。中,在创建一个类对象时会自动调用类的构造函数,对象超出作用域时会自动调用析构函数。等,都是在构造函数中获取资源,在析构函数中自动清除,不需要显式的清除资源。提出来的,直接翻译过来就是资源获取即初始化,是一个非常强大的编程概念。其他的诸如管理文件描述符,套接字,登陆信息的上下文等,使用。欢迎访问个人网络日志🌹🌹。原创 2023-04-19 23:16:07 · 973 阅读 · 0 评论 -
14.C++中的智能指针
创建aPtr和bPtr时,各自的引用计数会变成1,接着2个赋值语句,又把各自的引用计数加了1,就都变成了2,然后离开作用域,会减1,这样各自的引用计数还保持1,这样就无法释放内存空间,就不会去执行A和B的析构函数。智能指针与常规指针行为类似,但两者的重要区别是智能指针能自动释放他所指向的内存。返回了指向智能指针管理对象的内置指针,提供这个函数,主要是为了向不能使用智能指针的代码中传递一个内置指针。因此,在创建智能指针的时候,必须提供指针可以指向的类型。的引用计数本身是安全无锁的,但对象的读写不是,原创 2023-03-19 16:31:44 · 1129 阅读 · 0 评论 -
12.typedef的使用与结构体定义
typedef是C/C++语言中保留的关键字,用来定义一种数据类型的别名。typedef并没有创建新的类型,只是指定了一个类型的别名而已。typedef定义的类型的作用域只在该语句的作用域之内, 也就是说如果typedef定义在一个函数体内,那么它的作用域就是这个函数。如果typedef定义在一个命名空间中,则其作用域只在当前命名空间中。原创 2023-03-06 22:56:10 · 722 阅读 · 2 评论 -
13.C++中static的应用及文件包含
对比第一次报错,不加条件编译在编译时就报错,加了条件编译,编译能通过,但链接时报错。在这里注意的是,变量/函数/类/结构体的重复定义不仅会发生在源程序编译的时候,在目标程序链接的时候同样也有可能发生。原创 2023-03-18 16:59:53 · 985 阅读 · 0 评论 -
(十一) 编译工具cmake
如前面,自定义共享库,并安装到指定目录,当想在。原创 2022-12-20 22:28:39 · 1629 阅读 · 1 评论 -
(十)C++中的左值lvalue&右值rvaue
这种需要预处理/编译/汇编/链接的翻译成机器代码的语言,变量名不需要储存,只是为了方便程序员编程,在编译器编译时会确定每个变量的地址,所有的局部变量读写都会变成(栈地址 + 偏移)的形式。如上,其实左值表示的是对象的引用,而右值正是被左值指向的对象。在定义左值引用时都是定义变量的引用,而不能定义一个指向临时数据的左值引用,这可以使用右值引用来实现。中的基本概念,简单来说,左值就是一个表达式等号左边的部分,右值就是等号右边的部分。返回引用的函数的调用产生的是左值,返回值的函数调用产生的是右值。原创 2022-11-18 21:27:46 · 617 阅读 · 0 评论 -
(九)STL之algorithm
的元素放在后面,返回值为指向第二组元素的首指针。返回容器中的元素顺序不以一定与之前相同,有可能发生变化。欢迎访问个人网络日志🌹🌹。欢迎访问个人网络日志🌹🌹。返回和输入都是迭代器。原创 2022-10-16 21:47:18 · 264 阅读 · 0 评论 -
(八)C++中的面向对象
欢迎访问个人网络日志🌹🌹。欢迎访问个人网络日志🌹🌹。原创 2022-10-16 21:43:10 · 873 阅读 · 0 评论 -
(七)C++中实现argmin与argmax
(七)C++中实现argmin与argmax原创 2022-08-28 11:52:48 · 1328 阅读 · 0 评论 -
(六)C++中的functor与lambda
c++在函数后加const的意义是,定义的类的成员函数中,常常有一些成员函数不改变类的数据成员,也就是说,这些函数是"只读"函数,而有一些函数要修改类数据成员的值。如果把不改变数据成员的函数都加上const关键字进行标识,显然,可提高程序的可读性。不过,上述的方式是通过硬编码实现的,换一个加的值就要重新写一个函数,十分不方便。不过,模板函数的方式是在编译时需要确定参数和类型,因此其必须时。类型,不能传参数进去,也就是像如下方式,程序运行时会报错。,是任何像函数一样的函数。欢迎访问个人网络日志🌹🌹。...原创 2022-08-28 11:44:10 · 520 阅读 · 0 评论 -
(五)C++中的排序函数性能比较
的源码实现中,数据量大时采用QuickSort快排算法,然后分治部分的数据量小于某个门槛(16),为避免QuickSort快排的递归调用带来过大的额外负荷,就改用Insertion Sort插入排序。如果递归层次过深,还会改用HeapSort堆排序。C++中可用的排序算法有两个,一个是。:排序数组的头元素指针,被转成了。:数组中每个元素占用字节数。欢迎访问个人网络日志🌹🌹。上面的测试是随机生成含有。元素的数组,每个方法测试。欢迎访问个人网络日志🌹🌹。万次后的平均性能,可见。...原创 2022-08-27 12:32:33 · 537 阅读 · 0 评论 -
(四)C++的常用容器简析
C++常用标准容器原创 2022-04-19 01:10:49 · 161 阅读 · 0 评论 -
(三)C++中的内存管理
C与C++中的动态内存的管理原创 2022-04-17 12:18:18 · 581 阅读 · 0 评论 -
(二)C++ variable-sized object may not be initialized
C++ variable-sized object may not be initialized原创 2022-04-16 12:46:35 · 1885 阅读 · 2 评论 -
(一)函数与指针
C++中的函数指针与指针函数原创 2022-03-20 12:12:41 · 775 阅读 · 0 评论 -
C语言中的时间函数
头文件time.h @函数名称: localtime 函数原型: struct tm *localtime(const time_t *timer) 函数功能: 返回一个以tm结构表达的机器时间信息 函数返回: 以tm结构表达的时间,结构tm定义如下: [cpp] view plain copy struct t转载 2017-07-21 20:20:43 · 925 阅读 · 0 评论 -
在Eclipse中实现C++ 11的完整支持
主要用来解决,Eclipse中编译c++时,出现的std::threads,std::mutex等的unresolved问题打开Project -> Properties -> C/C++ General -> Path and Symbols -> Tab [Symbols]. 添加 symbol : __cplusplus 并设定它的值为:201103L原创 2017-05-16 22:54:50 · 1540 阅读 · 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 · 263 阅读 · 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 · 518 阅读 · 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 · 2574 阅读 · 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 · 480 阅读 · 0 评论 -
STL vector简介
一、vector 的初始化:可以有五种方式,举例说明如下:(1) vector a(10); //定义了10个整型元素的向量(尖括号中为元素类型名,它可以是任何合法的数据类型),但没有给出初值,其值是不确定的。(2)vector a(10,1); //定义了10个整型元素的向量,且给出每个元素的初值为1(3)vector a(b); //用b向量来创建a向量,整体复制性赋值(4转载 2017-04-23 23:19:20 · 303 阅读 · 0 评论