- 博客(70)
- 资源 (8)
- 收藏
- 关注
转载 C++抽象类和接口类
C++中的接口和抽象类常常令人困惑。与Java或C#等其他编程语言不一样,C++中没有定义接口和抽象类的关键字。但是,也可以像其他语言一样,在C++中使用接口和抽象类。当试图创建一个功能的多个版本时,当创建的对象之间存在某种关系时,我们使用抽象类。在了解如何定义抽象类和接口之前,让我们先了解在C++中什么是虚方法和纯虚方法。当实现的功能彼此不相关时,创建的每个对象都是独立的,我们使用接口。:是一种不需要定义而只需要声明的虚方法,它是通过在方法最后添加。首先,我们来比较接口和抽象类的概念。
2023-09-04 22:46:39 225
原创 cmake中install指令参数介绍
安装指定的目标(可执行文件、库文件等)。可以指定安装目标的输出路径和相关属性。:将指定目标的运行时依赖项作为依赖项集合进行安装。:将指定目录中的文件和子目录复制到安装目录。:安装从外部导入的运行时目标的运行时文件。:在安装期间执行指定的CMake代码。:安装和导出指定的目标和文件。:安装可执行文件到指定目录。:安装指定的文件到指定目录。:在安装期间执行指定的脚本。
2023-06-29 15:19:08 1859
原创 cmake 中CMAKE_BUILD_TYPE 和CMAKE_TOOLCHAIN_FILE 作用以及include_directories和target_include_directories区别
总结一下,include_directories 适用于全局范围,而 target_include_directories 适用于针对特定目标的范围,可以更细粒度地控制包含文件的作用范围。target_include_directories 是一个针对特定目标的命令,用于为指定的目标添加包含文件目录。include_directories 和 target_include_directories 都是 CMake 中用于添加包含文件目录的命令,但它们的作用范围和用法略有不同。
2023-06-29 11:25:49 1254
原创 C++智能指针自定义删除器
对于,自定义删除器可以通过指定一个可调用对象来实现,可调用对象的类型可以是函数指针、函数对象或者lambda表达式等,通常使用lambda表达式比较方便。其中,T是指向被管理对象的指针类型,是用户定义的释放资源的代码。支持两种指定删除器的方式:一种是在声明unique_ptr其中Deleter是自定义删除器类型,ptr是对象名。另一种是通过reset()成员函数或release()
2023-05-05 00:02:18 1499
原创 C++ 中std::function各种使用方法和例程
C++ 中 std::function 是一个通用的函数封装器,可以用来包装任何可调用对象(例如函数、成员函数、lambda 表达式等),并且可以像函数一样调用包装后的可调用对象。
2023-04-03 22:33:38 1479
原创 智能指针的拷贝构造函数和移动构造函数的作用和目的
std::unique_ptr的拷贝构造函数的作用和目的是禁止拷贝语义,即不允许复制一个std::unique_ptr对象。这是由于std::unique_ptr的语义要求它是唯一拥有其指向的对象的所有权,因此禁止多个std::unique_ptr对象共享同一个指针,以避免悬挂指针问题。如果确实需要共享指针,应该使用std::shared_ptr。这里使用std::move将ptr1的所有权转移到ptr2中,ptr1不再拥有指向int对象的所有权。
2023-03-27 18:22:09 1556
转载 一文读懂C++右值引用和std::move
作者:rickonji 冀铭哲C++11引入了右值引用,有一定的理解成本,工作中发现不少同事对右值引用理解不深,认为右值引用性能更高等等。本文从实用角度出发,用尽量通俗易懂的语言讲清左右值引用的原理,性能分析及其应用场景,帮助大家在日常编程中用好右值引用和std::move。1. 什么是左值、右值首先不考虑引用以减少干扰,可以从2个角度判断:左值可以取地址、位于等号左边;而右值没法取地址,位于等号右边。int a = 5;a可以通过 & 取地址,位于等号左边,所以a是左值。
2022-05-09 01:05:46 433
转载 给buildroot添加自己的软件包,自动安装到rootfs
官网本身有详细教程,这里只是简单说一下。0. 源码 hello.c和Makefile一起放在了~/buildroot-2020.08.1/dl/helloworld 文件夹hello.c#include <stdio.h>int main(){ printf("buildroot helloworld\n"); return 0;}Makefile:OPT = -O2DEBUG = -gOTHER = -Wall -Wno-.
2022-01-27 15:22:09 3028
原创 Python项目生成requirements.txt文件之pipreqs的使用
生成requirements.txt时使用pip freeze > requirements.txt会将环境下所有的安装包都进行生成,再进行安装的时候会全部安装很多没有的包.耗时耗力其实是不可取的 .使用pipreqs,这个工具的好处是可以通过对项目目录的扫描,发现使用了哪些库,生成依赖清单。安装pip install pipreqs使用在项目的根目录下 使用 pipreqs ./pipreqs ./ --encoding=utf8最后最后生成出来的re...
2021-11-05 00:32:38 1574
转载 C++子类构造函数初始化及父类构造函数初始化
我们知道,构造方法是用来初始化类对象的。如果在类中没有显式地声明构造函数,那么编译器会自动创建一个默认的构造函数;并且这个默认的构造函数仅仅在没有显式地声明构造函数的情况下才会被创建创建。构造函数与父类的其它成员(成员变量和成员方法)不同,它不能被子类继承。因此,在创建子类对象时,为了初始化从父类中继承来的成员变量,编译器需要调用其父类的构造函数。如果子类的构造函数没有显示地调用父类的构造函数,则默认调用父类的无参构造函数,至于什么是显式调用,下面会详细说明!下面我们将从以下四种情况讲解c++子类构
2021-11-04 16:31:41 6074 2
转载 第9章 Linux进程和信号超详细分析
9.1 进程简单说明进程是一个非常复杂的概念,涉及的内容也非常非常多。在这一小节所列出内容,已经是我极度简化后的内容了,应该尽可能都理解下来,我觉得这些理论比如何使用命令来查看状态更重要,而且不明白这些理论,后面查看状态信息时基本上不知道状态对应的是什么意思。但对于非编程人员来说,更多的进程细节也没有必要去深究,当然,多多益善是肯定的。9.1.1 进程和程序的区别程序是二进制文件,是静态存放在磁盘上的,不会占用系统运行资源(cpu/内存)。进程是用户执行程序或者触发程序的结果,可以认
2021-11-01 15:53:02 501
转载 c++ 左值引用与右值引用
左值引用先看一下传统的左值引用。int a = 10;int &b = a; // 定义一个左值引用变量b = 20; // 通过左值引用修改引用内存的值左值引用在汇编层面其实和普通的指针是一样的;定义引用变量必须初始化,因为引用其实就是一个别名,需要告诉编译器定义的是谁的引用。int &var = 10;上述代码是无法编译通过的,因为10无法进行取地址操作,无法对一个立即数取地址,因为立即数并没有在内存中存储,而是存储在寄存器中,可以通过下述方法解决
2021-08-13 00:35:42 339
转载 linux nc命令传输文件
工作中,由于开发机与线上机器分属不同的机房,需要跳板机进行登录,而跳板机的scp功能貌似受限,导致线上和线下机器传输数据非常麻烦,速度还较慢。得高手指点,nc也可用于文件传输,且不依赖于scp。一、接收端pc命令:ip:192.168.228.222nc -l 1234 > install.log二、发送端pc命令:ip:192.168.228.221nc 192.168.228.222 1234 < install.log三、命令语法想要连接到某处: nc [-o
2021-08-10 20:13:35 761
转载 System V 与 POSIX 简介与对比
当我们在 Linux 系统中进行进程间通信时,例如信号量,消息队列,共享内存等方式,会发现有System V以及POSIX两种类型。今天我们就来简单介绍下它们。POSIX:POSIX(Portable Operating System Interface for Computing Systems)是由IEEE 和ISO/IEC 开发的一簇标准。该标准是基于现有的UNIX 实践和经验,描述了操作系统的调用服务接口,用于保证编制的应用程序可以在源代码一级上在多种操作系统上移植运行。它是在1980 年
2021-07-31 23:32:23 4108
转载 C++11特性:decltype关键字
decltype简介我们之前使用的typeid运算符来查询一个变量的类型,这种类型查询在运行时进行。RTTI机制为每一个类型产生一个type_info类型的数据,而typeid查询返回的变量相应type_info数据,通过name成员函数返回类型的名称。同时在C++11中typeid还提供了hash_code这个成员函数,用于返回类型的唯一哈希值。RTTI会导致运行时效率降低,且在泛型编程中,我们更需要的是编译时就要确定类型,RTTI并无法满足这样的要求。编译时类型推导的出现正是为了泛型编程,在非泛型编
2021-07-30 01:00:52 250
转载 C++ delete 和 delete []的区别
delete 释放new分配的单个对象指针指向的内存delete[] 释放new分配的对象数组指针指向的内存那么,按照教科书的理解,我们看下下面的代码:int *a = new int[10];delete a; //方式1delete [] a; //方式2肯定会有很多人说方式1肯定存在内存泄漏,是这样吗?(1). 针对简单类型 使用new分配后的不管是数组还是非数组形式内存空间用两种方式均可 如:int *a = new int[10];delete a
2021-07-28 11:42:58 320
转载 C++动态绑定原理
C++ 多态一般我们问到c++的三大特性是什么?我们基本都知道封装,继承,多态,进一步问什么是多态?我们也能够回答说多态是通过虚函数实现的,是一种通过动态绑定实现对不同的类调用不同的函数接口,等等。。但是再继续问,什么是动态绑定,虚函数怎么实现的,等等,基本上不经常用c++的,就回答不出来了。继承和多态的作用:继承对程序编写的作用在于我们可以更容易的定义和其它类相似,但是不相同的新类而多态的作用在于我们可以通过动态绑定,在使用这些类进行编写程序时,可以一定程度上忽略其区别。虚函数:c
2021-07-22 00:55:51 1124
原创 CMake --- 生成多个执行文件
需求:执行一次编译生成多个可执行文件。文件夹下有两个main文件:main1.cpp 和 main2.cpp,执行一次编译生成main1.exe和main2.exe。实现:main1.cpp和main2.cpp的内容相同,如下:#include <iostream>using namespace std;int main(int, char**) { std::cout << "Hello, world!\n"; return 1;}..
2021-07-18 01:35:09 4845 2
转载 CMake为自己创建的库添加版本信息
1.Windows平台Windows上的DLL是可以带上文件信息的,包括版本号、公司名等。如果你使用Visual Studio自带的动态链接库工程目标开发DLL,那么VS会帮你把这些信息加到最后生成的DLL中;但是CMake不会,默认情况下通过add_library生成的DLL没有任何额外信息。那么在CMake工程中,如何给生成的DLL加这些信息呢?版本信息作用正规公司出品的DLL一般都会有版本信息。比如我们右键点击Qt的随便一个DLL,选择属性,在“详细信息”那个tab下就可以看到很多信息:
2021-06-20 01:37:43 4362 3
转载 嵌入式开发 - GDB调试Coredump问题
这里介绍如何用Coredump文件查找崩溃的位置,使用的工具是gdb。另外一种调试Coredump问题的方便的办法,是使用backtrace()等相关函数。1. 生成Debug版本软件包使用选项CMAKE_BUILD_TYPE编译工程生成程序和库。$ cmake -DCMAKE_BUILD_TYPE=Debug .用cpack工具生成软件包mypkg.tar.gz。$ cpack -c CPackConfig.cmake2. 设置Linux生成Corecore..
2021-06-03 23:20:32 526
转载 git获取远程服务器的指定分支
昨天糗大了...进入新公司,公司服务器上有Online为线上版本,开发版本默认的为Master,本地clone的开发版为master,公司用的git 自动部署(puh后服务器自动更新了代码...这个有很多配置教程,这里就不赘述啦),本地开发分支master,一般流程是 合并到online分支后,把online push到远程分支....这个是流程OK不说了场景是这样的:本地master执行 checkout -b online后git push origin online 发现权限不够....囧.
2021-05-29 18:20:06 658
转载 C++ delete 和 delete []的区别
转载自https://blog.csdn.net/cbNotes/article/details/389007991.我们通常从教科书上看到这样的说明:delete 释放new分配的单个对象指针指向的内存delete[] 释放new分配的对象数组指针指向的内存那么,按照教科书的理解,我们看下下面的代码:int *a = new int[10];delete a; //方式1delete [] a; //方式2肯定会有很多人说方式1肯定存在内存泄漏,是这样吗.
2021-05-23 23:25:08 120
转载 C++11 中的std::function和std::bind
1. 可调用对象可调用对象有一下几种定义:是一个函数指针,参考 C++ 函数指针和函数类型; 是一个具有operator()成员函数的类的对象; 可被转换成函数指针的类对象; 一个类成员函数指针;C++中可调用对象的虽然都有一个比较统一的操作形式,但是定义方法五花八门,这样就导致使用统一的方式保存可调用对象或者传递可调用对象时,会十分繁琐。C++11中提供了std::function和std::bind统一了可调用对象的各种操作。不同类型可能具有相同的调用形式,如:// 普通.
2021-05-17 23:46:45 206
原创 Linux下如何查看系统启动时间和运行时间
https://www.cnblogs.com/xd502djj/archive/2011/05/03/2035599.html
2021-05-15 16:50:11 144
转载 curl和wget的区别和使用
curl和wget基础功能有诸多重叠,如下载等。非要说区别的话,curl由于可自定义各种请求参数所以在模拟web请求方面更擅长;wget由于支持ftp和Recursive所以在下载文件方面更擅长。类比的话curl是浏览器,而wget是迅雷9。1.下载文件curl -O http://man.linuxde.net/text.iso #O大写,不用O只是打印内容不会下载wget http://www.linuxde.net/text.iso .
2021-05-10 22:57:37 158
转载 Linux生产环境上,最常用的一套“sed“技巧
sed命令应用广泛,使用简单,是快速文本处理的利器。它其实没多少技巧,背诵、使用是最合适的学习渠道,属于硬技能。但它又很复杂,因为高级功能太多。本篇不去关注sed的高级功能,仅对常用的一些操作,进行说明。随着使用,你会发现它和vim的一些理念是想通的,正则表达式的语法也基本上一样,并没有多少学习成本。从个人视野和工作效率上来看,sed命令都是程序员必须掌握的一个重要工具。那些说可以现场google用法的,大多习惯将文本拷贝到excel里,慢慢磨洋工,遇到大批量文件更是手忙脚乱。不是一家人不进一家门,
2021-05-03 15:55:11 161
转载 Linux命令学习手册-cpio
cpio [选项] > 文件名或者设备名 cpio [选项] < 文件名或者设备名功能cpio命令是通过重定向的方式将文件进行打包备份,还原恢复的工具,它可以解压以.cpio或者.tar结尾的文件。描述选项说明:详细选项说明参看下表, 包括:选项、含义-o将文件拷贝打包成文件或者将文件输出到设备上。 -i将打包文件解压或者将设备上的备份还原到系统。 -t查看cpio打包的文件内容或者输出到设备上的文件内容。 -v显示打包过程中的文件名称。 -...
2021-05-02 17:18:30 232
转载 为什么需要 extern “C“ ?如何从C中调用C++函数
为什么需要 extern "C"?假设我们有下面三个文件:// util.hint add(int, int);// util.cint add(int a, int b){ return a + b;}// main.c#include "util.h"int main(int argc, char *argv[]){ int sum = add(1, 2); return 0;}使用 gcc 编译,生成的符号表内容分别是下面..
2021-04-02 00:14:57 557
原创 C++智能指针shared_ptr怎样自定义释放函数,有几种方法?shared_ptr是怎么释放各种复杂的指针的呢?
https://blog.popkx.com/C-%E6%99%BA%E8%83%BD%E6%8C%87%E9%92%88shared_ptr%E6%80%8E%E6%A0%B7%E8%87%AA%E5%AE%9A%E4%B9%89%E9%87%8A%E6%94%BE%E5%87%BD%E6%95%B0-%E6%9C%89%E5%87%A0%E7%A7%8D%E6%96%B9%E6%B3%95-shared_ptr%E6%98%AF%E6%80%8E%E4%B9%88%E9%87%8A%E6%94%BE%E
2021-03-19 01:53:40 1599
原创 vector中emplace_back方法的用途
在写代码的过程中,CLion提醒我把push_back方法替换成emplace_back方法:emplace_back函数的作用是减少对象拷贝和构造次数,是C++11中的新特性,主要适用于对临时对象的赋值。在使用push_back函数往容器中增加新元素时,必须要有一个该对象的实例才行,而emplace_back可以不用,它可以直接传入对象的构造函数参数直接进行构造,减少一次拷贝和赋值操作。例如以下学生类:class stu_info {private: string name
2021-03-13 10:13:01 10826
原创 Linux 共享内存
共享内存上:https://www.ibm.com/developerworks/cn/linux/l-ipc/part5/index1.html共享内存下:https://www.ibm.com/developerworks/cn/linux/l-ipc/part5/index2.html
2021-02-28 11:29:47 137
转载 深入剖析mmap 从三个问题说起
概述对于mmap,您是否能从原理上解析以下三个问题:mmap比物理内存+swap空间大情况下,是否有问题? MAP_SHARED,MAP_PRIVATE,MAP_ANONYMOUS,MAP_NORESERVE到底有什么区别? 常听说mmap的读写比传统的系统调用(read, write)快,但真的是这样子吗?原因是什么?要解决这些疑问,可能还需要在操作系统层面多了解。本文将尝试通过这些问题深入剖析,希望通过这篇文章,能使大家对mmap有较深入的认识,也能在存储引擎的设计中,有所参考。背景
2021-02-28 00:38:36 1108
转载 Linux 虚拟内存和物理内存的理解
关于Linux 虚拟内存和物理内存的理解。首先,让我们看下虚拟内存:第一层理解1.每个进程都有自己独立的4G内存空间,各个进程的内存空间具有类似的结构2.一个新进程建立的时候,将会建立起自己的内存空间,此进程的数据,代码等从磁盘拷贝到自己的进程空间,哪些数据在哪里,都由进程控制表中的task_struct记录,task_struct中记录中一条链表,记录中内存空间的分配情况,哪些地址有数据,哪些地址无数据,哪些可读,哪些可写,都可以通过这个链表记录3.每个进程已经分配的内存空间,都...
2021-02-21 13:24:18 343
转载 理解 Linux 的虚拟内存
前言前不久组内又有一次我比较期待的分享:”Linux 的虚拟内存”。是某天晚上加班时,我们讨论虚拟内存的概念时,leader 发现几位同事对虚拟内存认识不清后,特意给这位同学挑选的主题(笑)。我之前了解一些操作系统的概念,主要是毕业后对自己大学四年的荒废比较懊恼,觉得自己有些对不起计算机专业出身,于是在工作之余抽出时间看了哈工大在网易云课堂的操作系统公开课,自己也读了一本讲操作系统比较浅的书 《Linux内核设计与实现》,而且去年自己用 C 写简单的服务器时,也追根究底了解了更多的系统底层知识。多亏
2021-02-21 13:21:27 151
转载 ubus
一、 介绍ubus提供了一种多进程通信的机制。存在一个守护进程ubusd,所以进程都注册到ubusd,ubusd进行消息的接收、分发管理。ubus依赖于ubox ubus启动后会在后台运行ubusd进程,该进程监听一个unix套接字用于与其他应用程序通信。其他应用程序可基于libubox提供的接口(或自己实现)与其通信。 ubus是为发送消息而设计的,不合适传输大量数据。ubusd二、三种实现方式:1. invoke的方式实现端对端通信server端:ubu..
2021-02-17 11:25:04 1611
gcc make makefile cmake cmakelist 区别
2018-04-17
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人