- 博客(23)
- 收藏
- 关注
原创 C++对象模型——Function语意学
文章目录前言一、Member的各种调用方式二、虚拟成员函数三、函数的效能四、指向Member Function的指针前言本章主要介绍了各种成员函数的调用方式,特别是存在继承和多态时的虚函数调用。成员函数可以被看作是类作用域的全局函数, 不在对象分配的空间里,而存在于代码段, 只有虚函数才会在类对象里有一个指针, 存放虚函数的地址等相关信息(即虚函数表)。调用成员函数时,类对象的地址通过this指针作为参数隐式传递给成员函数,成员函数通过对象地址隐式访问成员变量。this指针是由编译器生成,当类的非
2021-06-27 18:36:46
287
原创 C++对象模型——Data语意学
文章目录前言一、对象的内存布局二、Data Member的绑定三、Data Member的布局四、Data Mmber的存取五、继承与Data Member六、指向Data Members的指针前言提示:这里可以添加本文要记录的大概内容:例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。提示:以下是本篇文章正文内容,下面案例可供参考一、对象的内存布局1、空类也有 1Byte 的大小,因为这样才能使得这个 class 的 o
2021-06-27 18:20:44
863
原创 C++对象模型——构造函数语意学
文章目录前言一、默认构造函数的构造操作二、拷贝构造函数的构造操作三、程序转化语意学前言本章主要介绍了编译器何时会合成构造函数以及构造一个对象的过程。一、默认构造函数的构造操作(1)关键词explicit之所以被导入这个语言,就是为了给程序员提供一种方法,使他们能够制止”单一参数的constructor“被当作一个conversion运算符。(2)默认构造函数只有在编译器需要它的时候才会被合成出来,也就是是说合成出来的默认构造函数一定是nontrivial的,而trivial的默认构造函数只存在
2021-06-27 18:13:41
192
原创 C++对象模型——关于对象
文章目录前言一、加上封装后,布局成本增加了多少?二、C++的对象模型三、struct关键字四、对象的差异前言最近在学习《深度探索C++对象模型》,真心觉得这是一本很不错的书籍,看了之后觉得自己对对象的内存布局、构造、析构操作以及虚函数的调用等有了进一步的了解,对于一些C++规则存在的内在原因也算是知其所以然了。比如说C++2.0之前要求inline函数“类内声明,类外定义”,原因是在C++早期的编译器上,如果inline函数中存取的data member在该函数之后声明,则data member的绑定
2021-06-27 18:01:05
158
原创 MySQL中Innodb引擎的索引更新策略
说到索引更新,就一定要先了解MySQL的buffer pool和change buffer。buffer pool是主存中用来存储常用数据和索引的一块空间,它通过LRU(Least recently used)algorithm来替换页(其实和操作系统中的“页”的概念是相似的,都是从磁盘拉到主存中的一块数据),buffer pool的存在,即缓存的存在都是为了减少I/O操作,因为I/O操作太费时间了(毕竟不是由CPU直接管辖的)。change pool是缓冲区的一部分(如下图所示),它用来负责二级索引(也
2021-05-29 15:26:26
619
原创 MySQL(2)
文章目录MySQL(2)编码约束约束的种类级联约束多表查询合并结果集连接查询子查询MySQL(2)编码1、查看MySQL数据库编码show variables like 'char%'; # 通配符%代表任意多个字符2、编码解释character_set_client:MySQL使用该编码来解读客户端发过来的数据,例如编码为utf8,如果客户端发送过来的数据不是utf8,就会发生乱码。如何解决乱码呢?#方法一set character_set_client = gbk; # 仅在当
2021-05-28 22:15:21
80
原创 MySQL(1)
数据库——MySQL文章目录数据库——MySQL前言MySQL——基础准备阶段SQL基础语句DDLDMLDQLDCL前言MySQL是关系型数据库,主要用于存放持久化数据,将数据存储在硬盘中,读取速度较慢。MySQL作为持久化存储的关系型数据库,相对薄弱的地方在于每次请求访问数据库时,都存在着I/O操作。如果反复频繁的访问数据库,(1)会在反复链接数据库上花费大量时间,从而导致运行效率过慢;(2)反复的访问数据库也会导致数据库的负载过高。MySQL——基础准备阶段开启(关闭)MySQL服务器
2021-05-28 21:52:32
196
1
原创 进程间通信
进程间通信由于进程之间不共享地址空间,所以要想实现进程间的通信,需要采取以下几种方法。管道管道本质上就是一个文件,前面的进程以写方式打开文件,后面的进程以读方式打开。这样前面写完后面读,于是就实现了通信,我们可以看出,管道实现的通信是单向的,如果我们想要实现双向通信,就必须创建两个管道。管道中存放的是无格式的字节流数据。实际上管道的设计也是遵循UNIX的“一切皆文件”设计原则的,它本质上就是一个文件。Linux系统直接把管道实现成了一种文件系统,借助VFS给应用程序提供操作接口。详细参考博客http
2021-05-24 19:31:51
103
原创 进程间通信方式之一——信号
信号信号是由用户、系统或者进程发送给目标进程的信息,以通知目标进程某个状态的改变或系统异常。Linux信号可由如下条件产生:(1)对于前台进程,用户可以通过输入特殊的终端字符来给它发送信号;(2)系统异常,比如浮点异常和非法内存段访问;(3)系统状态变化,比如alarm定时器到期将引起SIGALARM信号;(4)运行kill命令或调用kill函数。注意:服务器必须处理(或忽略)一些常见的信号,以免异常终止。Linux信号表取值名称解释默认动作1SIGHUP挂起
2021-05-24 19:22:44
364
原创 STL容器
文章目录容器序列式容器vectorliststack和queuedequepriority queueslist关联式容器标准的STL关联式容器非标准的STL关联式容器容器SGI STL的容器之间的关系可以由下面这张图表示:该图以内缩的方式来表达基层与衍生层之间的关系。heap内含一个vector,而priority-queue内含一个heap。stack和queue内含deque,因为它们都是在deque的基础上关闭某些功能而形成的。set、map、multiset和multimap都内含一颗
2021-05-21 16:09:07
1260
原创 并发编程
并发,顾名思义,就是逻辑控制流在时间上重叠。并发机制运用在两个方面,一个是操作系统内核用于运行多个应用程序;一个是应用程序用于响应异步事件等,称为应用级并发,具体应用如下:1、Linux信号处理程序允许应用响应异步事件,例如用户键入Ctrl+C(终止进程)会发生以下事件:(1)用户输入命令,在Shell下启动一个前台进程;(2)用户按下Ctrl-C,这个键盘输入产生一个硬件中断;(3)如果CPU当前正在执行这个进程的代码,则该进程的用户空间代码暂停执行,CPU从用户态切换到内核态处理硬件中断;(4
2021-04-30 22:00:55
209
1
原创 计算机网络(3)
本篇梳理一下传输层的相关协议,特别是TCP协议的一些特点。UDP(用户数据报协议)UDP特点:无连接不可靠面向报文, 发送方的UDP对应用层交下来的报文,在添加首部后就下交IP层。对应用层交下来的报文,既不合并也不拆分,而是保留这些报文的边界没有拥塞控制支持一对一、一对多、多对一、多对多通信首部开销小,仅8字节UDP报文格式:2222源端口目的端口长度校验和UDP之间的通信需要用到端口号,但因为它是无连接的,所以不需要使用套接字。UDP的协议号是
2021-04-20 22:09:33
151
原创 计算机网络(2)
上一篇对输入URL后的操作流程以及数据封装(解封)过程做了一个整理,但其中还有很多细节值得我们去学习。比如说,在各个层有哪些具体的协议,这些协议又以何种方式实现何种功能?在这篇文章中,我先对网络层的一些重要知识点进行提炼整理,上一篇的框图中进行标注过的就不再详细说明。IP地址(分类的IP地址和无分类域间路由选择CIDR)(1)分类的IP地址:A类 网络号8位,第1位固定为1,可指派网络号个数为2^7-2(除去全0和127),主机号24位,可指派主机号个 数为2^23-2(除去全0和全1),全0表示网
2021-04-19 22:50:43
103
原创 计算机网络(1)
在浏览器中输入URL(统一资源定位符)后到底发生了什么呢?从这个问题开始,我会通过一系列的博客对计算机网络的知识进行一个梳理。URL的标准格式:[协议类型]://[服务器地址]:[端口号]/[资源层级UNIX文件路径][文件名]?[查询]#[片段ID]如,https://www.baidu.com。https为协议类型,因为绝大部分网页都采用的超文本传输协议,所以大多数浏览器不要求客户输入https://。同样的,80是超文本传输协议的常用端口号,所以不用写明。www.baidu.com是服务器的域
2021-04-19 22:35:14
74
原创 理解阻塞I/O和非阻塞I/O,同步I/O和异步I/O
首先需要明确一下系统调用的概念:当运行在用户空间的程序需要向内核请求更高权限的服务时,需要进行系统调用,它提供操作系统和用户程序之间的接口,类似于普通库函数,但是由操作系统内核提供并运行于内核态,而普通库函数由函数库或用户自己提供并运行于用户态。因此,进行系统调用时会经历从用户态转到内核态运行一段时间,然后再转回到用户态的过程。阻塞I/O和非阻塞I/O阻塞I/O:系统调用会被操作系统挂起,直至等待的事件发生位置。非阻塞I/O:系统调用会立刻返回,不管事件有没有发生。若事件没有发生或出错,均返回-1,并
2021-04-11 23:01:28
270
原创 安全漏洞之SQL注入和shell注入
SQL注入发生部位SQL注入安全漏洞发生于应用程序和数据库之间。原理当攻击者在输入的字符串之中注入SQL指令,由于程序没有设置相关的字符检查,那么这些指令就会被数据服务器认为是正常的SQL指令并执行,因此,数据服务器就会遭到破坏或者数据被泄露出去。示例某个网站的登录验证的SQL查询代码为strSQL = "SELECT * FROM users WHERE (name = '" + userName + "') and (pw = '"+ passWord +"');"恶意填入userN
2021-03-19 20:43:24
1041
原创 c标准库函数——system()
c标准库函数——system()声明:int system(const char *command)command为请求执行的shell命令构成的字符数组。使用:char command[50]; strcpy( command, "ls -l" ); //列出 unix 机上当前目录下所有的文件和目录int status = system(command);该函数执行的步骤是:(1)在当前进程fork一个子进程;(2)调用/bin/sh拉起shell脚本,在子进程中运行shell
2021-03-19 17:12:11
529
原创 动态内存(1)
智能指针设计智能指针的原因:由于动态内存的使用很容易出问题,一旦忘记释放内存,就会产生内存泄漏;又或是在尚有指针引用内存的情况下释放了内存,这就会产生引用非法内存的指针;还有可能对同一块内存释放两次,导致自由空间被破坏。这三种情况都可能产生很严重的后果且很难进行trouble shooting。因此,设计出智能指针类对普通指针(内置指针类型)进行一定的包装,从而实现自动释放所指对象,并且,智能指针类以模板的方式呈现,这就使得该类具有很好的泛化能力。智能指针分类c++11提供了两种智能指针shared_
2021-03-13 21:58:56
92
原创 无人机仿真平台的搭建
安装系统Ubuntu 18.04的安装具体可参考这篇博文安装仿真软件简介1、ROS(Robot Operating System,机器人操作系统),是专为机器人软件开发所设计出来的一套电脑操作系统架构。2、gazebo是一款3D动态模拟器,能够在复杂的室内和室外环境中准确有效地模拟机器人群。3、为了实现对无人机的仿真,我们还需要安装无人机飞控软件,目前最受欢迎,且发展得最为全面的开源飞控就属下面这两款了:PX4官网链接APM官方链接这里先讲述APM的安装过程。安装ROS注意
2021-03-08 21:09:01
1988
1
原创 ROS常用命令
因为项目中需要用到ROS,而常常不记得命令,所以对常用的ROS命令做了个整理,方便参考。1、查看ROS_PACKAGE_PATH环境变量$ echo $ROS_PACKAGE_PATH2、roscore 命令是在运行所有ROS程序前首先要运行的命令,用于向节点提供连接信息$ roscore3、运行launch文件,launch文件时描述一组节点以及它们话题重映射和参数的XML文件$ rosrun [package_name] [launchfile_name]4、rosbash命令集的命
2021-03-08 19:43:54
493
原创 GNU源代码开放精神
最近在看侯捷的《STL源码剖析》,对书中讲到的GNU源代码开放精神有点兴趣,所以就做了一点整理。GNU起源于美国人Richard Stallman,他在1984年离开麻省理工学院后,创建了自由软件基金会(Free Software Foundation, FSF)以致力于弘扬开放源代码精神,并写下了著名的GNU宣言。Richard Stallman于1989年发表GNU通用公共许可协议,给予了终端用户运行、学习、共享和修改软件的自由。 GNU(GNU is Not Unix)的名称带有一定的幽默成分,
2021-02-25 22:14:23
580
原创 Jupyter notebook文字排版笔记
主题需要提前安装一下主题更改工具,在命令行输入以下命令即可实现工具的下载安装。pip install --upgrade jupyterthemes查看可用主题jt -lgithub文档中给出了详细的参数,并且提供了如何使用的样例,例如:jt -t solarizedd -f fira -fs 115运行后重新打开jupyter,可以得到这样的效果:其他可用参数还包括-cel...
2020-04-28 02:09:58
2816
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人