![](https://img-blog.csdnimg.cn/20201014180756757.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++
yyyzhhhhh
123
展开
-
C++迭代器失效的情况
分为两种情况:1.vector(内存连续的数组,还有deque等),增加、删除元素都会导致迭代器失效2.其他容器,删除当前迭代器指向的元素会导致迭代器失效,别的迭代器不受影响原创 2020-09-28 21:02:23 · 79 阅读 · 0 评论 -
std::move和std::forward
作用:都是一样的,内部实现都是static_cast<T&&>。主要是语义不一样:std::move主要是为了把一个值(不管是左值还是右值)变成一个右值,从而触发参数为右值引用的函数,要是没有这个函数,再触发const T&的函数。std::forward主要是用在模板编程中的折叠引用,无论是传入左值还是右值,折叠引用进入函数后都是左值,std::forward的目的就是恢复该值原来的左/右值属性。右值引用的作用:减少传入右值时的拷贝考虑构造函数:传入一个左值时,原创 2020-09-28 20:52:52 · 136 阅读 · 0 评论 -
静态库和动态库
https://blog.csdn.net/qq_41786318/article/details/79545018转载 2020-09-19 21:41:10 · 77 阅读 · 0 评论 -
内存泄漏、死锁怎么检测?
内存泄漏:valgrind,gpreftools,vs自带的内存检测工具死锁:详见:https://blog.csdn.net/a13602955218/article/details/108685059调试:gdb调试线上代码,打印堆栈信息原创 2020-09-19 19:48:58 · 184 阅读 · 0 评论 -
成员函数调用虚函数会怎样
class A{public: void func(){ cout << "hello" << endl; vfunc(); } virtual void vfunc(){ cout << "vfuncA" << endl; }};class B:public A{public: void func(){ vfunc(); } v原创 2020-09-14 13:47:55 · 377 阅读 · 0 评论 -
堆priority_queue的使用
priority_queue<ListNode*,vector<ListNode*>,decltype(cmp)> h(cmp);原创 2020-09-05 14:33:10 · 267 阅读 · 0 评论 -
Linux中的上下文
上下文的种类:用户级上下文:其实就是虚拟内存(mm_struct),包括数据段,代码段,堆栈,mmap等内核级上下文:内核栈硬件级:寄存器(PC,IP,BP,SP,CR3等)上下文切换类型:1.进程/线程上下文切换:1.2.3都会发生,上下文存储在用户栈2.内核上下文切换:只发生2.3,上下文存储在内核栈,内核栈每个线程都有一个3.中断上下文切换:只发生3,上下文存储在中断栈,中断栈一般每个处理器一个补充:在发生虚拟内存的切换时,需要切换页表,而页表的切换一般会导致TLB无效,同时,由于高速原创 2020-09-03 16:34:05 · 551 阅读 · 0 评论 -
c++中的volatle
在代码中int a = 1;int b = a;int c = a;当执行int b=a时,CUP会从a的内存中取值,加载到寄存器中,再用寄存器中的值赋值到b的地址。当执行int c = a时,由于编译期已经知道寄存器中有a的缓存,那么直接把寄存器中的值赋值到c的地址。但是问题来了,要是在多线程环境中,有别的线程修改了a的值呢,这时候由于编译器还是把寄存器中的旧值赋值给了c,导致程序的错误。那么volatile的作用是什么呢,就是强制编译器生成汇编代码的时候每次都得从a的内存中取址,不能因为想原创 2020-08-30 00:14:36 · 120 阅读 · 0 评论 -
右值引用的意义
首先理解深拷贝和浅拷贝:以字符串string为例,我们知道string内维护了一个char指针,指向一个堆对象。所谓的深拷贝,就是在拷贝的时候复制这个char指向的堆对象,所谓的浅拷贝就是不复制,直接用char*指针指向这个堆对象,这时候就会导致两个指针指向同一个对象,当一个string对象析构的时候,会把堆对象释放掉,而另一个string对象不知情,从而导致不可知的后果。所以一般字符串的拷贝我们需要采用深拷贝,即将堆对象复制一遍。但是若此时传入的是一个右值,而不是一个左值呢?若在这种情况下,右值最终原创 2020-08-29 20:37:32 · 2288 阅读 · 0 评论 -
惊群效应
惊群效应是指多个进程/线程用epoll监听同一个socket(一般是用于listen那个),一旦有事件到来,所有进程/线程都会从epoll_wait中唤醒,但只有其中一个能够accept,其他则继续阻塞等待,从而浪费了服务器资源。解决方法:使用epoll_wait前加锁,Nginx还加了一个负载均衡的算法,即任务量太大的进程/线程不获取锁直接epoll...原创 2020-08-29 02:17:44 · 114 阅读 · 0 评论 -
epoll中的LT,ET与ONESHOT
ONESHOT的作用是每次事件触发后,就从红黑树中删除监听这个socket,由于ET需要循环读取所有数据,因此没太大问题,但是LT一般只读取一次,加上ONESHOT的话就再也读取不了后面的数据了,因此LT也需要循环读取直到EAGAIN...原创 2020-08-29 01:44:26 · 748 阅读 · 0 评论 -
char *c = “abc“ 存储在什么地方?
静态存储区静态存储区还存储了:1.常量2.全局变量3.静态变量(全局,局部)原创 2020-08-28 23:50:01 · 876 阅读 · 0 评论 -
c++ 单例模式
https://www.cnblogs.com/sunchaothu/p/10389842.html转载 2020-08-25 19:58:13 · 78 阅读 · 0 评论 -
select和epoll底层原理
select原理概述调用select时,会发生以下事情:从用户空间拷贝fd_set到内核空间;注册回调函数__pollwait;遍历所有fd,对全部指定设备做一次poll(这里的poll是一个文件操作,它有两个参数,一个是文件fd本身,一个是当设备尚未就绪时调用的回调函数__pollwait,这个函数把设备自己特有的等待队列传给内核,让内核把当前的进程挂载到其中);当设备就绪时,设备就会唤醒在自己特有等待队列中的【所有】节点,于是当前进程就获取到了完成的信号。poll文件操作返回的是一组标准的掩码原创 2020-08-25 19:47:19 · 775 阅读 · 0 评论 -
linux elf文件 动态链接库的加载
首先elf文件包括1.可重定位文件:就是.o文件,用来连接生成可执行文件2.可执行文件,就是.out或.bin文件3.共享文件,就是.so或.a文件结构1.ELF header:管理下面3个table2.Program header table:用于可执行文件或共享文件,提供程序入口,代码段和数据段,里面包含多个segment(段),一个segment包含多个section3.Section header table:包含多个section,用于描述文件的静态信息4.Symbol table原创 2020-08-24 19:19:32 · 629 阅读 · 0 评论 -
c语言中的可变参数
https://www.cnblogs.com/zhaobinyouth/p/8781915.html转载 2020-08-24 00:43:51 · 157 阅读 · 0 评论 -
C++ 完美转发
所谓完美转发,其实就是定义参数为T&&的模板template<typename T>void func(T&& t){}当我们使用形参为左值时,不能传入右值,形参为右值时,不能传入左值。那么如何解决这个问题呢,那就是使用模板函数。将模板函数的参数类型声明为T&&,无论传入左值还是右值,它都能实例化出对应的函数。其实这里的T&&不应该叫右值引用,他有一个新的名字,叫做转发引用。那么T&&是如何根据传入的值原创 2020-08-23 23:34:13 · 289 阅读 · 0 评论 -
带const的指针
const在*左边,就是指向const的指针,指向内容不能改变const在*右边,那就是const指针,指针指向不能改变参考:https://www.cnblogs.com/qiumingcheng/p/11351854.html转载 2020-08-14 01:21:25 · 85 阅读 · 0 评论 -
epoll、select、poll区别和各自的使用场景
https://www.cnblogs.com/aspirant/p/9166944.html转载 2020-08-11 16:21:33 · 1653 阅读 · 0 评论 -
环形缓冲区(无锁队列)
条件:1.只有一个生产者和一个消费者2.生产者只操作写指针,消费者只操作读指针参考:https://www.cnblogs.com/dragonsuc/p/4048811.html转载 2020-08-11 15:32:16 · 296 阅读 · 0 评论 -
socketpair
本质是创建了一对AF_UNIX域的socket,使用时可以当做pipe使用参考:https://www.cnblogs.com/melons/p/5791793.html转载 2020-08-11 15:24:03 · 84 阅读 · 1 评论 -
new和malloc的区别
https://www.cnblogs.com/shilinnpu/p/8945637.html转载 2020-08-11 14:33:38 · 94 阅读 · 0 评论 -
c++中的lower_bound和upper_bound
lower_bound是找到第一个大于等于val的值,没有就返回enduppder_bound是找到第一个大于val的值,没有就返回end前提:数组是有序的用法template<class ForwardIterator, class Type> ForwardIterator lower_bound( ForwardIterator _First, ForwardIterator _Last, const Type& _Val原创 2020-06-12 10:43:41 · 315 阅读 · 0 评论 -
const char* 和char* const
前者不能改变所指对象,后者不能改变指向原创 2020-05-18 18:14:53 · 108 阅读 · 0 评论 -
在构造函数和析构函数抛出异常会发生什么
https://www.cnblogs.com/KevinSong/p/3323372.html1.析构函数抛异常,会导致未定义行为。若非抛不可,可以用try catch吞下2.构造函数可以抛异常,但是抛之前先释放资源,另外构造函数抛异常不会调用析构函数...转载 2020-05-15 01:19:27 · 351 阅读 · 0 评论 -
c语言中的typeof
和c++中的decltype关键字一样原创 2020-05-13 17:05:30 · 425 阅读 · 0 评论 -
获取结构体内成员的偏移值
1、包含头文件#include <stddef.h>,调用函数offsetof(struct s, i)来实现。2、使用(int)&(((s*)0)->i)的形式。原创 2020-05-13 17:04:34 · 326 阅读 · 0 评论 -
关于c++的wait,notify_one,notify_all
一般用法:std::unique_lock<std::mutex> m_lock(m_mutex);if(....){ m_cond.wait(m_lock);}m_lock:获取互斥量(锁);m_cond.wait:释放持有的锁,加入到等待队列中;notify_one:唤醒等待队列中的第一个线程;notify_all:唤醒等待队列中的所有线程;线程被唤醒后,重新竞争互斥量(锁),得到锁的线程从wait中返回。直到离开m_lock的作用于或重新调用wait,锁才被释放。需原创 2020-05-10 01:35:31 · 2890 阅读 · 0 评论 -
c++ string 常见接口
https://www.jianshu.com/p/2e68b91de235转载 2020-04-29 23:07:07 · 129 阅读 · 0 评论 -
C++字符串和数字间的转换
数字转字符串:to_string(n)字符串转数字stoi()stol()stoll()stof()stod()原创 2020-04-22 14:01:44 · 87 阅读 · 0 评论 -
C++列表初始化和在函数体内初始化的区别
在列表初始化中才算是真正的初始化,而在函数体内的实际上是赋值操作,给成员变量分配内存是在列表初始化中完成的。明白了这点就可以明白两点:1.const变量的初始化只能在列表初始化中完成,因为在函数体内是赋值操作,我们不能对const变量进行赋值操作。2.含有类对象的最好在列表初始化中完成,如果在函数体内进行赋值,实际上是在列表初始化中先调用了类对象默认构造函数,然后在函数体内调用了operat...原创 2020-04-19 01:44:38 · 474 阅读 · 0 评论 -
怎样定义只存在于堆/栈的对象
1.只存在于堆:将构造函数设置为private,再定义一个create函数,里面申请堆空间上的对象,并返回指针。另外,将构造函数定义为private有一个副作用:该类不能被继承。2.只存在于栈:将类中的operator new定义为private即可参考:https://www.cnblogs.com/conard/p/4857315.html...原创 2020-04-19 01:32:32 · 190 阅读 · 0 评论 -
operator new与malloc的区别
operator new可以分为2个部分1.调用类自定义的operator new()函数,若无定义,则调用全局的operator new()函数,该函数默认调用malloc()2.对分配到的内存调用构造函数参考:https://my.oschina.net/lcxidian/blog/382254...原创 2020-04-19 01:29:49 · 1070 阅读 · 1 评论 -
C++四种cast
https://www.cnblogs.com/lsgxeva/p/11005293.html总的来说,就是可以实现任意类型之间的转换(不同类型的指针,不同类型的函数,指针和整数等),直接按位翻译。...原创 2020-04-17 17:18:21 · 123 阅读 · 0 评论 -
数组和指针的区别
https://www.cnblogs.com/zhanjindong/archive/2013/02/15/2912892.html转载 2020-04-17 01:14:19 · 95 阅读 · 0 评论 -
栈溢出攻击
https://www.cnblogs.com/Donoy/p/5690402.html转载 2020-04-15 17:06:27 · 138 阅读 · 0 评论 -
weak_ptr的使用
weak_ptr不能直接使用->和*,需要通过lock()转换为shared_ptr后才能使用->和*;weak_ptr不增加引用计数参考:https://www.cnblogs.com/xiaoshiwang/p/9721763.html原创 2020-04-14 11:25:21 · 118 阅读 · 0 评论 -
auto_ptr和unique_ptr
auto_ptr使用权转换是隐式的,难以察觉的unique_ptr实现更加严格的使用权转换,直接赋值是过不了编译的auto_ptr<string> p1 = new string("hello");auto_ptr<string> p2 = p1;//此时p2指向"hello",p1指向null,p1不能用了!但是难以察觉unique_ptr<string...原创 2020-04-14 02:08:44 · 128 阅读 · 0 评论 -
不要用智能指针指向数组
因为智能指针默认调用delete析构,指向数组需要制定delete[]原创 2020-04-14 01:54:48 · 569 阅读 · 0 评论 -
在const成员函数修改成员变量
将成员变量定义为mutable原创 2020-04-14 01:28:34 · 620 阅读 · 0 评论