C/C++
幸运小猴子
这个作者很懒,什么都没留下…
展开
-
shared_ptr
shared_ptr原创 2023-02-26 16:58:38 · 120 阅读 · 0 评论 -
std::function
std::functionstd::function<void()> func;类模板std::function是一种通用,多态的函数封装。std::function的实例可以对任何可以调用的目标实体进行存储,复制,和调用操作,这些目标实体包括普通函数,lambda表达式,函数指针,以及其他函数对象等。通常std::function是一个函数对象类,它包装其它任意的函数对象,被包装的函数对象具有类型为T1, …,TN的N个参数,并且返回一个可转换到R类型的值。std::function使原创 2021-02-07 11:52:06 · 95 阅读 · 0 评论 -
vector的坑,你踩过吗?
C++的容器真的是不好学啊最近用了resize这个方法,resize只会把新增的元素赋初值,之前的元素并不会修改!!例如:std::array<bool, 64> matched_{};//array的初始化可以直接用{},不用memset_s原创 2020-12-29 17:20:42 · 189 阅读 · 0 评论 -
指针
摘自:https://www.jianshu.com/p/b5f68f5330beint p; //这是一个普通的整型变量int p; //首先从P 处开始,先与结合,所以说明P 是一个指针,然后再与int 结合,说明指针所指向的内容的类型为int 型.所以P是一个返回整型数据的指针int p[3]; //首先从P 处开始,先与[]结合,说明P 是一个数组,然后与int 结合,说明数组里的元素是整型的,所以P 是一个由整型数据组成的数组int p[3]; //首先从P 处开始,先与[]结合,因为其转载 2020-12-03 13:18:51 · 89 阅读 · 0 评论 -
C++11 R字符串原始字面量
原始字符串字面量的定义为:R “xxx(raw string)xxx”其中,原始字符串必须用括号()括起来,括号的前后可以加其他字符串,所加的字符串会被忽略,并且加的字符串必须在括号两边同时出现。#include <iostream>#include <string>int main(){ // 一个普通的字符串,'\n'被当作是转义字符,表示一个换行符。 std::string normal_str = "First line.\nSecond line原创 2020-11-06 09:43:11 · 4829 阅读 · 0 评论 -
原码,反码,补码
原码:是最简单的机器数表示法。用最高位表示符号位,‘1’表示负号,‘0’表示正号。其他位存放该数的二进制的绝对值。3: 0011-3: 1011反码:1.正数的反码还是等于原码2.负数的反码就是他的原码除符号位外,按位取反3: 0011-3: 1100补码:1.正数的补码等于他的原码2.负数的补码等于反码+1。...原创 2020-09-11 14:57:02 · 72 阅读 · 0 评论 -
库函数的实现
库函数的实现:memcpy函数的实现void *memcpy(void *dest, const void *src, size_t count) { char *tmp = dest; const char *s = src; while (count--) *tmp++ = *s++; return dest;}Strcpy函数实现char *strcpy(char *dst,const char *src) { assert(dst != NULL &&原创 2020-08-05 20:03:59 · 122 阅读 · 0 评论 -
线程池
什么时候需要创建线程池呢?简单的说,如果一个应用需要频繁的创建和销毁线程,而任务执行的时间又非常短,这样线程创建和销毁的带来的开销就不容忽视,这时也是线程池该出场的机会了。如果线程创建T1和销毁时间T3相比任务执行时间T2可以忽略不计,则没有必要使用线程池了。反之如果T1+T3>T2,那就很有必要使用线程池。#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <sys/typ原创 2020-07-27 14:41:17 · 114 阅读 · 0 评论 -
mysql_c_API
1.连接数据库 :MYSQL mysql;mysql_init(&mysql);mysql_real_connect(&mysql, “localhost”, “root”, “6748355”, “spytest”, 0, NULL, 0);/*练习mysql数据库的连接*/ #include <stdio.h> #include <mysql.h> int main() { MYSQL mysql; int t,原创 2020-07-26 21:24:57 · 88 阅读 · 0 评论 -
多线程
一、创建线程多线程编程的第一步,创建线程。创建线程其实是增加了一个控制流程,使得同一进程中存在多个控制流程并发或者并行执行。pthread_create(&tid, NULL, (void *)func, NULL);//创建次线程pthread_join(tid, &retval);//阻塞等待次线程结束,结束后该函数回收次线程占用的资源(retval为返回值)pthread_detach(tid);//分离次线程,让次线程再结束时自动回收资源。pthread_cancel(t原创 2020-07-25 17:56:57 · 99 阅读 · 0 评论 -
map下标操作和insert区别
map中不允许存在相同的key下标:map<int, int> a;a[1] = 1; //初始化a[1],并给a[1]赋值。a[1] = 2; //修改了a[1]的值。insert:a.insert(map::value_type(1,1)); //初始化a[1],并给a[1]赋值。a.insert(map::value_type(1,2)); //a[1]已经存在,不能初始化,也不能修改a[1]。insert时,若存在该键值,则不做任何操作,insert返回pair<m原创 2020-07-22 10:37:18 · 243 阅读 · 0 评论 -
四种强制类型转换
强制类型转换时有一定风险的,例如把整形转成指针,基类指针转成派生类指针,常量指针转成非常量指针等。C语言中的强制类型转换(Type Cast)有显式和隐式两种,显式一般就是直接用小括号强制转换。没有从形式上体现出转换功能和风险的不同。1.static_cast:低风险的类型转换,没有运行时类型检查来保证转换的安全性。(1)用于类层次结构中基类(父类)和派生类(子类)之间指针或引用的转换。 进行上行转换(把派生类的指针或引用转换成基类表示)是安全的; 进行下行转换(把基类指针或引用转换原创 2020-07-16 12:08:05 · 1224 阅读 · 0 评论 -
malloc
发成缺页中断后,执行了那些操作?当一个进程发生缺页中断的时候,进程会陷入内核态,执行以下操作:1、检查要访问的虚拟地址是否合法2、查找/分配一个物理页3、填充物理页内容(读取磁盘,或者直接置0,或者啥也不干)4、建立映射关系(虚拟地址到物理地址)重新执行发生缺页中断的那条指令如果第3步,需要读取磁盘,那么这次缺页中断就是majflt,否则就是minflt。内存分配的原理从操作系统角度来看,进程分配内存有两种方式,分别由两个系统调用完成:brk和mmap(不考虑共享内存)。1、brk是将数原创 2020-07-13 11:11:17 · 513 阅读 · 0 评论 -
两级allocator
两级allocator:当请求内存较大(大于128bytes)时,采用第一级allocator小于128bytes时,采用第二级allocator,采用内存池的方法管理小内存.内存申请大于128bytes时,第一级allocator直接调用malloc和free函数,并模拟C++的set_new_handler函数处理内存不足的情况。第二级allocator则复杂很多,具体实现包括:维护16个自由链表(free_list),负责16种不同大小的内存空间分配。0:8;1:16…;15:120 byt原创 2020-07-13 10:46:58 · 109 阅读 · 0 评论 -
高频高频
1.C++面向对象的三种特性?封装:可以隐藏细节,使得代码模块化。把数据和方法封装成抽象的类,只让可信的类或对象操作,对不可信的隐藏。继承:它可以使用现有类的所有功能,并在进行扩展。多态:父类的指针指向子类的对象。多态的实现方式?覆盖(重写)和重载(其实不是多态,静态的)。2.构造函数可以是虚函数么?构造函数不可以是虚函数,因为含有虚函数的类中有虚表指针,指向虚函数表。当定义一个对象的时候,首先会分配对象内存空间,然后调用构造函数来初始化对象。虚表指针就是在构造函数中进行初始化的。因为执行虚函数原创 2020-07-02 23:37:39 · 230 阅读 · 0 评论 -
STL-set/map/vector/list
map和set都是C++的关联容器,其底层实现都是红黑树。unordered_map底层是哈希表1.map中的元素是key-value(关键字-值)对;关键字起到索引的作用,值则表示与索引相关联的数据;set与之相对就是关键字的简单集合,set中每个元素只包含一个关键字。2.set的迭代器是const的,不允许修改元素的值;map允许修改value,但不允许修改key。其原因是map和set是根据关键字排序来保证其有序性的。3.map支持下标操作,set不支持下标操作。map所有元素是pair,底层原创 2020-06-30 15:09:17 · 87 阅读 · 0 评论 -
C_points
1.C和C++的struct有什么不同?C和C++的struct的主要区别是C中的struct不可以包含成员函数,而C++中的struct可以。C++中struct和class主要区别在于默认权限不同,struct默认为public,class默认为private.2.const和define的比较?const常量有数据类型,而宏常量没有数据类型。编译器可以对const常量进行类型安全检查,但对define常量只能进行字符替换。GDB工具可以对const常量进行调试,但不能对宏常量调试。3.引用和指原创 2020-06-22 20:37:11 · 738 阅读 · 0 评论