C/C++
文章平均质量分 87
这个作者很懒,什么都没留下…
泠山
欢迎提出任何想法和指正,没回复多半是太忙了
展开
-
C++分析程序各模块耗时-perf火焰图
perf 是一个非常实用且深入的性能分析工具,适用于从底层硬件交互到上层应用程序逻辑的全方位性能剖析。perf 工具的设计目的是为了帮助开发者和系统管理员分析应用程序以及内核本身的性能,寻找潜在的性能瓶颈,并据此进行针对性的优化。原创 2024-04-07 20:23:53 · 1735 阅读 · 1 评论 -
C++三五法则
如果没有这条规则,可能会创造出无法被私有的对象。理论上来说,当析构函数不能被访问时,任何静态定义的对象都不能通过编译器的编译,所以这种情况只会出现在与动态分配有关的拷贝/默认构造函数身上。原创 2024-02-04 16:13:01 · 1490 阅读 · 0 评论 -
CMake 官方完整版
假设,出于教学的目的,我们决定不使用平台log和exp函数,而是希望生成一个预先计算值的表,以便在mysqrt函数中使用。在本节中,我们将创建表作为构建过程的一部分,然后将该表编译到我们的应用程序中。首先,让我们删除中对log和exp函数的检查。然后从mysqrt.cxx中删除对HAVE_LOG和HAVE_EXP的检查。同时,我们可以删除。在子目录中,有一个名为的新源文件被提供来生成表格。检查完文件后,我们可以看到表是作为有效的 C++ 代码生成的,并且输出文件名作为参数传入。下一步是创建。原创 2023-09-26 15:35:10 · 1464 阅读 · 0 评论 -
Linux 下的进程间通信
共享文件共享内存(通过信号量)管道(命名和无名)消息队列套接字信号甚至在今天,在以线程为中心的语言,例如 Java、C# 和 Go 等变得越来越流行的情况下,IPC 仍然很受欢迎,因为相比于使用多线程,通过多进程来实现并发有着一个明显的优势:默认情况下,每个进程都有它自己的地址空间,除非使用了基于共享内存的 IPC 机制(为了达到安全的并发,竞争条件在多线程和多进程的时候必须被加上锁),在多进程中可以排除掉基于内存的竞争条件。转载 2023-09-03 23:27:13 · 202 阅读 · 0 评论 -
C++11 emplace_back 和 push_back
参数 args 被传递给内存分配函数,而内存分配函数将其展开,并使用接收三个参数的 Items 构造函数(#2),而不是默认构造函数(#1)。),这里将展开为 Items(8.2, 2.8, 3)。还可以注意的一点是,如果 MyObject 没有定义移动构造函数,编译器将使用复制构造函数。接下来,构造函数 Items() 创建一个临时 Items 变量,该对象被复制到 vt 的开头,然后被删除。与移动语义一样,就地创建旨在提高效率。在矢量中就地创建所需的对象,而不是创建一个临时变量,再将其复制到矢量中。原创 2023-08-07 11:42:58 · 418 阅读 · 0 评论 -
GoogleTest 官方文档
GoogleTest 是 Google 的 C++ 测试和模拟框架。原创 2023-07-20 20:05:40 · 603 阅读 · 0 评论 -
C++17 并行STL算法
表t22.2列出了标准中支持的所有不需要修改就可以并行运行的算法。无限制的并行算法(和“搜索器”一起使用时除外)fill()generate()无并行版本的算法search()(和“搜索器”一起使用时)注意对于为了并行地运行,使用reduce()或者。为了并行地运行,使用...scan()算法。为了并行地运行,使用。表t22.4列出了标准支持的所有只需要进行一些修改就可以并行运行的算法。算法限制for_each()返回类型void、前向迭代器前向迭代器(新)前向迭代器前向迭代器。转载 2023-07-19 10:05:09 · 2113 阅读 · 0 评论 -
C++11 字面量操作符
2. 字面量重载运算符可以把字面值常量(注意只能是字面值常量,也就是“123”,123,1.23,‘a’这样,不能是变量),转化为需要的类型对象。这些字面量可以直接在代码中使用,并具有与其类型相对应的值和语义。它们提供了一种直观和方便的方式来表示常量值,并在编程中广泛使用。C++支持多种类型的字面量,包括整数、浮点数、字符、字符串和布尔值。原创 2023-07-05 15:20:35 · 856 阅读 · 0 评论 -
boost::program_options 用法详解
program options是一系列组成的选项列表,它允许程序通过命令行或配置文件来读取这些参数选项。转载 2023-07-03 15:08:29 · 967 阅读 · 0 评论 -
C++类型转换运算符(dynamic_cast, const_cast, static_cast,reinterpret_cast)
在 C++的创始人 Bjame Stroustrup 看来,C 语言中的类型转换运算符太过松散。首先,上述3种类型转换,哪一种是有意义的?除非不讲理,否则它们中没有一个是有意义的。其次,这3中类型转换中哪种是允许的呢?在C语言中都是允许的。对于这种松散情况,Stroustrup 采取的措施是,更严格地限制允许的类型转换,并添加4可以根据目的选择一个适合的运算符,而不是使用通用的类型转换。这指出了类型转换的原因,并让编译器能够检査程序的行为是否与设计者想法吻合。原创 2023-05-29 19:05:51 · 946 阅读 · 0 评论 -
C++ RAII机制
RAII 的全称是 Resource Acquisition Is Initialization,它是一种编程技术,用于管理资源的生命周期,确保在对象的构造函数中获取资源,而在析构函数中释放资源。这个技术是基于C++的对象生命周期和作用域规则的特性来实现的。资源的获取:RAII的核心思想是,将资源(如内存、文件句柄、互斥锁等)的获取操作放在对象的构造函数中。这意味着在创建对象时,资源将被自动获取,并且只有在对象的构造函数成功完成后,资源才会被获取。这样可以确保资源在有效的对象生命周期内一直可用。资源的释放。原创 2023-05-16 19:26:58 · 688 阅读 · 0 评论 -
C++ 并行编程(thread)---多线程
进程:指在系统中正在运行的一个应用程序;程序一旦运行就是进程;进程——资源分配的最小单位。线程:系统分配处理器时间资源的基本单元,或者说进程之内独立执行的一个单元执行流。是程序执行的最小单位。原创 2022-10-31 16:10:21 · 13731 阅读 · 7 评论 -
CMakeLists Option使用简介
CMake中的option用于控制编译流程,相当于C语言中的宏条件编译。转载 2022-10-27 14:54:57 · 2568 阅读 · 0 评论 -
CMakeLists 基础
Reference:1. 第一个CMakeLists.txt文件文件树如下: 文件如下:注意事项:文件树如下: 文件如下:3. 如果工程里包含静态库呢?文件树如下:main.cpp 文件如下:4. 如果工程里包含共享库呢?文件树如下: 文件如下:5. 如果工程里包含第三方库呢?main.c 如下所示: 文件如下:如上所述,find_package()函数将从 CMAKE_MODULE_PATH 中的文件夹列表中搜索 “FindXXX.cmake” 中的CMake模块。find转载 2022-06-25 17:09:28 · 732 阅读 · 2 评论 -
C++ atof
函数原型函数说明atof 为 ascii to floating point numbers 的缩写,将字符串转换为双精度浮点数(double);atof() 会扫描输入字符串 str*,跳过前面的空格字符(如空格,tab等),直到遇到数字或正负符号才开始做转换,在遇到非数字 或 该字符串结束(‘\0’) 时会结束转换,并将结果返回。 字符串 str* 可包含、或来表示指数部分,如 123.456 或 123e-2;返回值返回转换后的浮点数,如果字符串 str* 不能被转换为 double,原创 2022-06-17 15:30:47 · 3290 阅读 · 0 评论 -
C++/OpenCV 计算模块执行时间方法
计算模块执行时间方法1. OpenCV1.1 使用方式Reference:OpenCV 利用getTickCount()与getTickFrequency()计算执行时间1. OpenCVOpenCV 中使用 getTickCount() 和 getTickFrequency() 计算执行时间,两个API均被定义在了core.hpp文件下。1.1 使用方式auto start_time = cv::getTickCount();... ...auto end_time = cv::g原创 2021-06-10 16:32:53 · 657 阅读 · 1 评论 -
点到线段的最短距离算法
点到线段的最短距离算法1. 经典算法2. 面积算法3. 矢量算法Reference:点到线段的最短距离算法点到线段最短距离的运算与点到直线的最短距离的运算二者之间存在一定的差别,即求点到线段最短距离时需要考虑参考点在沿线段方向的投影点是否在线段上,若在线段上才可采用点到直线距离公式,如下图所示,左边的最短距离为点 PPP 与其在线段 ABABAB 上投影 CCC 之间的线段 PCPCPC;右边的最短距离为点 PPP 与端点 BBB 或 AAA 所构成的线段 PBPBPB 或 PAPAPA。转载 2021-07-30 11:41:55 · 7698 阅读 · 0 评论 -
C++多态和抽象类
C++多态和抽象类1. 多态1.1 虚函数概述Reference:明日科技 《零基础学 C++》1. 多态多态性(polumorphism) 是面向对象程序设计的一个重要特征,利用多态性可以设计和实现一个易于扩展的系统。在 C++ 语言中,多态性是指具有不同功能的函数可以用同一个函数名,这样就可以用一个函数名调用不同内容的函数。当发出同样的消息被不同类型的对象接收时,导致完全不同的行为。这里所说的消息主要指类的成员函数的调用,而不同的行为是指不同的实现。多态性通过联编实现。联编是指一个计算机程转载 2021-07-27 22:50:46 · 902 阅读 · 0 评论 -
C++ STL关联式容器
关联式容器1. set 类模板1.1 set 对象主要成员函数及说明2. multiset 类模板2.1 multiset 对象主要成员函数及说明3. map 类模板3.1 map 对象主要成员函数及说明4. multimap 类模板关联式容器(associative)是 STL 提供的容器的一种,其中的元素都是经过排序的,它主要通过关键字的方式来提高查询的效率。关联式容器包括 set、multiset、map、multimap 和 hash table。1. set 类模板set 类模板又称为集合类原创 2021-07-22 23:01:40 · 402 阅读 · 1 评论 -
C++ STL算法
C++ STL算法1. 非修正序列算法1.1 adjacent_find(first,last)算法是 STL 的中枢,STL 提供了算法库,算法库中都是模板函数。迭代器主要负责从容器中获取一个对象,算法与具体对象在容器中的什么位置等细节不用考虑。每个算法都是参数化一个或多个迭代器类型的函数模板。标准算法分 4 个类别:非修正序列算法、修正序列算法、排序算法和数值算法。1. 非修正序列算法非修正序列算法不修改它们所作用的容器,例如计算元素个数或查找元素的函数。STL 中提供的非修正序列算法如下所示:转载 2021-07-22 22:58:11 · 617 阅读 · 0 评论 -
C++ extern “C”的作用详解
C++ extern “C”的作用详解1.示例2. 补充说明-C、C++编译器3. extern "C"使用要点Reference:extern “C”的作用详解 extern "c" 的主要作用就是为了能够正确实现C++代码调用其他C语言代码。加上 extern “c” 后,会指示编译器这部分的代码按C语言,而不是C++的方式进行编译。由于C++支持函数重载,因此编译器编译函数的过程中会将函数的参数类型也加到编译后的代码中,而不仅仅是函数名;而C语言并不支持函数重载,因此编译C语言代码的函数时转载 2021-05-10 15:42:46 · 10647 阅读 · 0 评论 -
C++ linux命令解析参数 getopt_long 函数
C++ linux命令解析参数 getopt_long 函数1. 关于命令行参数2. getopt_long函数2.1 参数2.2 全局变量2.3 返回值3. 示例Reference:getopt函数的使用浅谈linux的命令行解析参数之getopt_long函数在 LInux 中,经常需要各种命令,这些函数是如何解析的呢?一种方式是使用 GNU C 提供的函数 getopt、getopt_long 或 getopt_long_only 来解析命令行参数。1. 关于命令行参数命令行参数可以分原创 2021-04-06 17:31:55 · 1711 阅读 · 0 评论 -
C++11中std::function和std::bind及在ROS12中的使用
C++11中std::function和std::bind及在ROS2中的使用1. 可调用对象Reference:C++11 中的std::function和std::bind1. 可调用对象在 C++11 中经常提及 Callable object,即所谓的 可调用对象,常见的可调用对象有以下几种:functionmember functionfunction objectlambda expressionbind expressionC++11 中提供了 std::funct原创 2021-03-25 23:25:35 · 1416 阅读 · 0 评论 -
C++ lambda表达式入门
C++ lambda表达式入门1. 定义2. lambda表达式的使用1.1 最简单的 lambda表达式1.2 加上参数列表1.3 再加点打印的东西1.4 返回值1.5 捕捉变量1.6 STL应用Reference:C++ lambda表达式入门1. 定义lambda 表达式 就是一个(匿名)函数,也就是一个没有函数名的函数。为什么不需要函数名呢,因为我们一次性的用它,嵌入式用的它,不需要在其他地方调用它。lambda 表达式也叫闭包,闭就是封闭(其他地方都不调用)的意思,包就是函数。la转载 2021-03-25 19:42:12 · 960 阅读 · 0 评论 -
C++ DEBUG打印方式
C++ 快捷打印方式#define RESET "\033[0m"#define BLACK "\033[30m" /* Black */#define RED "\033[31m" /* Red */#define GREEN "\033[32m" /* Green */#define YELLOW "\033[33m" /* Yellow */#define BLUE "\033[34m" /* Blue */#原创 2021-01-22 12:12:00 · 1155 阅读 · 0 评论 -
C++ 宏定义
写宏的时候,尽量用括号将变量给括起来,以防止边际效应---->这里的 U 表示该常数用无符号整型方式存储,相当于 unsigned int;L 表示该常数用长整型方式存储,相当于 long;F 表示该常数用浮点方式存储,相当于 float。...原创 2020-11-05 17:18:01 · 2608 阅读 · 1 评论 -
程序快速排雷方法
_LINE_ 行号_FUNCTION_ 函数用法:可以用于程序错误时打印错误位置printf(“LINE:%d FUN_NAME:%s \n”, _LINE_, _FUNCTION_);原创 2020-10-14 15:25:51 · 160 阅读 · 0 评论 -
for(auto i : v)遍历容器元素
for(auto i: v)遍历容器元素1. auto2. auto&3. const auto&4. const autoC++11 新增了一种循环:基于范围(range-based)的 for 循环。这简化了一种常见的循环任务:对数组(或容器类,如 vector 和 array)的每个元素执行相同的操作,如下例所示:double prices[5] = {4.99, 10.99, 6.87, 6.47, 8.88};for (double x : prices) std::cou原创 2020-08-22 17:26:40 · 20621 阅读 · 4 评论 -
C++ Implement使用| 消除 warning C4251 | 精简库接口
C++ Implement的使用| 消除 warning C4251 | 精简库接口暴露成员变量的缺点解决办法代码示栗1. 不推荐的方式,即将成员变量暴露给用户:2. 推荐方式一3. 推荐方式二Reference:文章大多来源于: C++学习 | C++ Implement的使用 | 消除 warning C4251 | 精简库接口.在编写C++动态库的过程中,我们常常会听到某个要求:请隐藏动态库头文件里类接口里的成员变量!或者自己在编写动态库时,突然意识到自己好像让调用者看到的信息太多了,而这些原创 2020-08-04 17:20:25 · 855 阅读 · 1 评论 -
C++BUG: [Error] invalid array assignment
C++BUG: [Error] invalid array assignment1. Introduction2. memcpy()函数原型功能头文件返回值与strcpy的区别实例1. Introduction在使用数组给数组赋值时,会出现以上bug。大致的栗子如下:while(!student.eof()){ SS[j].name=stud.name;//报错! SS[j].ID=stud.ID; SS[j].score=stud.score;原创 2020-07-30 15:32:34 · 25357 阅读 · 2 评论 -
C++标准库之std::regex类的使用
Cpp标准库之 std::regex 类的使用1. 简介2. 正则表达式2.1 概念2.2 入门2.3 元字符2.4 字符转义2.5 重复2.63. 常用 C++ 标准库正则表达式类:4. 正则表达式模板的使用4.1 std::regex_search1. 简介在使用C++标准库之前,需优先学习正则表达式语法。2. 正则表达式2.1 概念在编写处理字符串的程序或网页时,经常会有查找付个某些复杂规则的字符串的需要。正则表达式就是用于描述这些规则的工具。换句话说,正则表达式就是记录文本规则的代码。很原创 2020-07-27 21:19:59 · 17435 阅读 · 0 评论 -
C++中的atan2与atan
C++中的atan2与atan1. atan(x)2. atan2(y,x)3. atan(y/x)与atan2(y,x)的区别反正切函数atan(double x)与atan2(double y,double x)存在于C语言的math.h或C++的cmath中。它们返回的值是弧度,要转化为角度得再做处理。1. atan(x)atan(x)表示求的是x的反正切,其返回值为[-pi/2,+pi/2]之间的一个数。2. atan2(y,x)atan2(y,x)表示求的是y/x的反正切,其返回值为[-原创 2020-07-17 15:21:43 · 5137 阅读 · 0 评论 -
C++ STL序列容器
C++ vector的使用1. 定义和初始化2. vector的几种重要操作3. vector排序4. 随机选择vector中的N项1. 定义和初始化std::vector<T> v1; //默认构造函数v1为空std::vector<T> v2(v1);//v2是v1的一个副本(相同地址还是复制?)std::vector<T> v3(n,i);//v3包含n个值为i的元素std::vector<T> v4(n); //v4含有n个值为0的元素2原创 2020-07-14 20:34:14 · 431 阅读 · 0 评论 -
C++智能指针、shared_ptr、enable_shared_from_this
由于C++语言没有自动内存回收机制,程序员每次new出来的内存都要手动delete。程序员忘记delete,流程更太复杂,最终导致没有delete,异常导致程序过早退出,没有执行delete的情况并不罕见。用智能指针便可以有效缓解这类问题。std::auto_ptr(已被C++11摒弃)、std::unique_ptr、std::shared_ptr、std::weak_ptr。原创 2020-07-08 15:12:54 · 472 阅读 · 2 评论 -
C++复合关系
c++复合关系方式一:方式二:方式三:方式四:Reference:1.正确处理类的复合关系------新标准c++程序设计2.程序设计与算法(三)C++面向对象程序设计假设要编写一个小区养狗管理程序,该程序需要一个“主人”类,还需要一个“狗”类。狗是有主人的,主人也有狗。假定狗只有一个主人,但一个主人可以有最多10条狗。该如何处理“主人”类和“狗”类的关系呢?方式一:#include<iostream>class CMaster{ CDog dogs[10]; i原创 2020-07-08 11:26:06 · 1328 阅读 · 0 评论 -
C++读取txt文件内容方式
C++读取txt文件内容方式一级目录二级目录三级目录鉴于网上的好多内容瞎鸡儿写,然而平时经常会使用到,因此在这里做一个总结。一级目录二级目录三级目录原创 2020-07-05 00:32:18 · 10713 阅读 · 0 评论