随笔分类 -  C++

摘要:1、背景 最近在看一个大佬写的服务器代码的时候,发现他写的单例模式代码很有趣,开始看的时候没看懂,后面研究了一把,发现这个代码其实就是boost里面的一种单例模式,虽然boost里面有很多单例模式,我们在这里就先研究我看到的这种。 我们来看最简单的单例模式: 这是最简单的版本,在单线程下(或者是C+ 阅读全文
posted @ 2017-12-15 21:17 Memset 阅读(629) 评论(0) 推荐(0)
摘要:1、背景 最近再看一个开源代码的时候,看到很多宏经常这么写的: 一眼看到的时候就知道这一份代码执行一次,那么do...while还有什么意义呢?在查阅了很多资料之后,才发现,do...while(0)用处太多了,所以在这里总结一下。 2、总结 2.1 辅助定义多语句宏 如果我们定义下列宏: 这个宏的 阅读全文
posted @ 2017-12-12 20:31 Memset 阅读(772) 评论(0) 推荐(0)
摘要:1、半同步半异步线程池 在处理大量并发任务的时候,如果一个请求一个线程来处理任务,大量的线程创建将会消耗过多的资源,还增加了线程上下文切换的开销,而通过线程池技术可以很好的解决这个问题。 线程池技术通过在系统中预先创建一些线程,当任务请求来到的时候,从线程池中分配一个预先创建的线程来处理任务,在任务 阅读全文
posted @ 2017-12-03 19:44 Memset 阅读(1219) 评论(0) 推荐(0)
摘要:1、异步操作 C++11提供了异步操作相关的类,std::future、std::promise和std::package_task。std::future作为异步结果的传输通道,方便的获取线程函数的返回值;std::promise用来包装一个值,将数据和future绑定起来,方便线程赋值;std: 阅读全文
posted @ 2017-12-03 19:36 Memset 阅读(1991) 评论(0) 推荐(0)
摘要:1、原子变量 C++11提供了原子类型std::atomic<T>,可以使用任意类型作为模板参数,使用原子变量就不需要使用互斥量来保护该变量,用起来更加简洁。 举个例子,如果要做一个计数器,使用mutex时和使用原子变量依次如下: 2、call_once/once_flag 单调函数就是在多线程环境 阅读全文
posted @ 2017-12-03 19:30 Memset 阅读(1155) 评论(0) 推荐(0)
摘要:1、简介 C11提供另外一种用于等待的同步机制,它可以阻塞一个或者多个线程,直到收到另外一个线程发出的通知或者超时,才会唤醒当前阻塞的线程。条件变量要和互斥量配合起来使用。 condition_variable,配合std::unique_lock<std::mutex>进行wait操作。 cond 阅读全文
posted @ 2017-12-03 19:28 Memset 阅读(1822) 评论(0) 推荐(0)
摘要:1、概述 锁类型 c11提供了跨平台的线程同步手段,用来保护多线程同时访问的共享数据。 std::mutex,最基本的 Mutex 类,独占的互斥量,不能递归使用。 std::time_mutex,带超时的独占互斥量,不能递归使用。 std::recursive_mutex,递归互斥量,不带超时功能 阅读全文
posted @ 2017-12-03 18:50 Memset 阅读(2824) 评论(0) 推荐(0)
摘要:1、线程的创建 C11创建线程非常简单,只需要提供线程函数就行,标准库提供线程库,并可以指定线程函数的参数。 2、阻塞&非阻塞 在线程执行的时候,可以选择线程是否阻塞执行,如果阻塞,则主线程等线程函数执行完,再往下执行,否则启动线程之后,主线程直接往下执行。 join函数会阻塞线程,直到线程函数执行 阅读全文
posted @ 2017-12-03 18:44 Memset 阅读(2323) 评论(0) 推荐(0)
摘要:1、原始字面值改善 原始字面值可以直接表示字符串的实际含义,但是一些特殊字符就需要转义。 那么这并不是我们想要的结果,C++中可以通过简单的方法可以改善这个问题。具体做法就是R"xxx(raw string)XXX",其中原始字符串必须用()括起来,口号的前后可以加其他字符串,所加的字符串是被忽略的 阅读全文
posted @ 2017-11-05 21:44 Memset 阅读(1044) 评论(0) 推荐(0)
摘要:1、委托构造函数 委托构造函数就是允许在同一个类中一个构造函数可以调用另一个构造函数,从而在初始化时简化变量的初始化。 这个例子表明,在成员变量众多、变量的初始化比较复杂的情况下,构造函数的工作是重复且繁琐的,那么就可以通过委托构造函数来解决问题。 这样优化之后,代码更加的简洁明了,但是这种链式调用 阅读全文
posted @ 2017-11-05 21:41 Memset 阅读(1206) 评论(0) 推荐(1)
摘要:1、数值类型和字符串转换 1.1 数值转换为字符 1.2 字符转换为数字 std::aoti(const char *):字符串转换为int类型。 std::aotl(const char *):字符串转换为long类型。 std::aotll(const char *):字符串转换为long lo 阅读全文
posted @ 2017-11-05 21:38 Memset 阅读(1819) 评论(0) 推荐(0)
摘要:C++11提供时间管理类,包括三种类型:时间间隔duration,时钟clocks,时间点time point。 1、记录时常的duration 1.1 原型 duration表示一段时间间隔,用来记录时间长度,可以表示时分秒等单位。其原型如下: Rep表示一个数值类型,表示时钟数的类型,第二个参数 阅读全文
posted @ 2017-11-05 21:35 Memset 阅读(2503) 评论(0) 推荐(0)
摘要:1、shared_ptr共享智能指针 std::shared_ptr使用引用计数,每个shared_ptr的拷贝都指向相同的内存,在最后一个shared_ptr析构的时候,内存才会释放。 1.1 基本用法 1.1.1 初始化 shared_ptr可以通过make_shared来初始化,也可以通过sh 阅读全文
posted @ 2017-10-17 22:13 Memset 阅读(4729) 评论(0) 推荐(2)
摘要:1、emplace_back减少内存拷贝和移动 emplace_back能通过参数构造对象,不需要拷贝或者移动内存,相比pusk_back能更好的避免内存的拷贝和移动,使容器插入元素性能得到进一步提升。几乎所有的标准库容器都增加了类型的方法:emplace,emplace_hint,emplace_ 阅读全文
posted @ 2017-10-17 22:04 Memset 阅读(1476) 评论(0) 推荐(0)
摘要:1、move C++11中可以将左值强制转换为右值,从而避免对象的拷贝来提升性能。move将对象的状态或者所有权从一个对象转移到另一个对象,没有内存拷贝。深拷贝和move的区别如图: 从图可以看出,深拷贝会有两份内存,而move只有一份,move只是将内存的所有者切换为目标对象,并没有移动任何东西, 阅读全文
posted @ 2017-10-17 22:01 Memset 阅读(1123) 评论(0) 推荐(0)
摘要:1、左值与右值 C++11中新增了一种类型,右值引用,标记为T &&。 首先来介绍什么是左值和右值,左值是指表达式结束后依旧存在的持久对象,而右值是指表达式结束之后就不再存在的临时对象。一个区分左值与右值的简单方法就是: 能不能对表达式取值,如果能,则是左值,否则为右值。所有具名变量或对象都是左值, 阅读全文
posted @ 2017-10-17 21:47 Memset 阅读(2190) 评论(0) 推荐(1)
摘要:tuple元组是一个固定大小不同类型的值的集合,是泛化的std::pair。我们也可以把它当作一个通用的结构体来使用,不需要创建结构体有获取结构体特征,在某些情况可以取代结构体,使程序更简洁、直观。 tuple在C++11中使用简单,但是往往要和模板元的一些技巧结合使用。 这个tuple等同于结构体 阅读全文
posted @ 2017-10-12 22:09 Memset 阅读(1398) 评论(0) 推荐(0)
摘要:1、 定义 lambda表达式是C++11非常重要也是很常用的特性之一,来源于函数式编程的概念,也是现代编程语言的一个特点。它有如下特点: 声明式编程风格:就地匿名定义目标函数或者函数,不需要额外写一个命名函数或者函数对象,以更直接的方式写程序。 简洁:不需要额外再写一个函数或者函数对象,避免了代码 阅读全文
posted @ 2017-10-12 22:05 Memset 阅读(10170) 评论(0) 推荐(0)
摘要:1、 可调用对象 在C++中,有“可调用对象”这么个概念,那么什么是调用对象呢?有哪些情况?我们来看看: 函数指针; 具有operator()成员函数的类对象(仿函数); 可以被转换为函数指针的类对象; 类成员(函数)指针。 我们来看代码: 上述的对象都是可调用对象,这些对象的类型统称为“可调用类型 阅读全文
posted @ 2017-10-12 21:56 Memset 阅读(2054) 评论(0) 推荐(0)
摘要:1、 for循环的新用法 在C++98/03中,通过for循环对一个容器进行遍历,一般有两种方法,常规的for循环,或者使用<algorithm>中的for_each方法。 for循环遍历: for_each方法: for_each相比一般的for循环,只需关注容器元素的类型,但是都是基于范围的循环 阅读全文
posted @ 2017-10-12 21:39 Memset 阅读(3440) 评论(0) 推荐(1)