6 &动感超人

尚未进行身份认证

我要认证

读书笔记,不求甚解!

等级
TA的排名 12w+

C++2.0——多线程的使用之condition_variable

<condition_variable > 头文件主要包含了与条件变量相关的类和函数,如下: condition_variable (C++11) condition_variable_any (C++11) notify_all_at_thread_exit (C++11) cv_status (C++11) std::condition_variablecondition_v

2020-10-27 00:11:23

C++2.0——多线程的使用async与future

std::asyncasync是一种利用现成的硬件并发来运行自包含异步任务的简单途径;对于async的调用返回一个包含任务结果的future;取决于启动的策略,该任务可以异步的运行在它自己的线程上,也可以同步第运行于任何在此future调用的wait或者get成员的线程上。template<classFunction,class...Args>std::future<std::result_of_t<std::decay_t<Function>(std...

2020-10-25 23:37:04

C++2.0——多线程的使用 promise 和 packaged_task

<future> 头文件中包含了以下几个类和函数: promise (C++11) future (C++11) shared_future (C++11) packaged_task (C++11) async (C++11)

2020-10-25 20:01:24

C++ 2.0——多线程的使用之lock_guard 与 unique_lock

C++标准为我们提供了以下基本的锁类型lock_guard(C++11) unique_lock(C++11) shared_lock(C++14) scoped_lock(C++17)以及还提供了几个与锁类型相关的 Tag 类:defer_lock_t不获得互斥的所有权 try_to_lock_t尝试获得互斥的所有权而不阻塞 adopt_lock_t假设调用方线程已拥有互斥的所有权struct defer_lock_t { }; /// Try to acquire...

2020-10-24 19:42:15

数据结构与算法——希尔排序与归并排序

希尔排序希尔排序(shell sort),对插入算法进行了有效的改进,是一种递减增量的排序算法。希尔排序算法是不稳定的,他是是基于插入排序提出改进方法的: 插入排序在对已经排好序的数据操作时,效率高,即可以达到线性排序的效率 但插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位。演示:描述:选择一个增量序列t1,t2,…,tk,其中ti>tj,tk=1; 按增量序列个数k,对序列进行k 趟排序; 每趟排序,根据对应的增量ti,将待排序列分割成若干长度为m 的子序列,分

2020-10-23 22:50:14

C++2.0 —— 多线程的使用之std::mutex

std::mutex 是C++11 中最基本的互斥量,std::mutex 对象提供了独占所有权的特性——即不支持递归地对 std::mutex 对象上锁,而 std::recursive_lock 则可以递归地对互斥量对象上锁。Mutex 分类std::mutex,最基本的 Mutex 类。 std::recursive_mutex,递归 Mutex 类。 std::time_mutex,定时 Mutex 类。 std::recursive_timed_mutex,定时递归 Mutex 类。

2020-10-23 00:27:18

C++2.0 —— 多线程的使用之std::thread

基本概念线程状态:在一个线程的生存期内,可以在多种状态之间转换,不同的操作系统可以实现不同的线程模型,定义许多不同的线程状态,每个状态还可以包含多个子状态,但大体来说,如下几种状态是通用的:就绪:参与调度,等待被执行,一旦被调度选中,立即开始执行 运行:占用CPU,正在运行中 休眠:暂不参与调度,等待特定事件发生 中止:已经运行完毕,等待回收线程资源线程环境:线程存在于进程之中,进程内所有全局资源对于内部每个线程都是可见的。进程内典型全局资源如下:代码区:这意味着当前进程空间内所

2020-10-22 23:10:16

数据结构与算法——冒泡排序,选择排序和插入排序

冒泡排序冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。演示:描述:比较相邻的元素。如果第一个比第二个大,就交换它们两个; 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数; 针对所有的元素重复以上的步骤,除了最后一个; 重复步骤1~.

2020-10-22 15:09:20

C++2.0—— 右值引用(Rvalue_reference)的使用

左值和右值左值(lvalue):表达式结束后依然存在的对象,也叫做变量; 右值(rvalue):右值标识是临时性对象的表达式,这类对象没有指定的变量名,都是临时生成的。引用一个引用是它所引用对象的同义词,是其另一个变量名。#include <iostream>using namespace std;int main() { int i = 10;//i:左值 10:右值 int& j = i;//j: 左值引用 j = 100; cout &l

2020-10-11 21:10:57

C++2.0——lambda、 override和final的介绍

LambdaISO C++ 11 标准的一大亮点是引入Lambda表达式,Lambda 表达式(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数。Lambda表达式可以表示闭包(注意和数学传统意义上的不同)。基本语法如下: [capturelist](parameterlist)mutable->...

2020-10-11 17:58:58

C++2.0—— =default,=delete、using、noexcept的介绍

=default在C++中,当我们设计与编写一个类时,若不显著申明,则类会默认为我们提供如下几个函数:构造函数 析构函数 拷贝构造函数 拷贝赋值函数 移动构造函数(C++2.0) 移动赋值函数 (C++2.0)C++11允许添加“=default”说明符到函数声明的末尾,以将该函数声明为显示默认构造函数;这就使得编译器为显示默认函数生成了默认实现,它比手动编程函数更加有效;当我们声明一个有参构造函数时,编译器就不会创建默认构造函数。在这种情况下,我们可以使用default说明符来创建默.

2020-10-11 16:25:13

C++2.0—— 一致性初始化(uniform initialization) 与 Initializer_list

Initializer_list一致性初始化(uniform initialization)C++11引入了“一致性初始化”概念,意思是面对任何初始化动作,可使用相同语法 {},进行一致性的初始化。

2020-10-11 00:14:56

C++2.0——explicit、decltype、nullptr、auto 和 for循环

explict在 c++2.0之前,一个参数的构造函数(或者除了第一个参数之外其余参数都有默认值的多参构造函数),承担着两个作用:1. 构造器2. 隐含的类型转换操作符;而explicit关键字一直存在,只能作用在构造函数中, 目的是阻止编译器进行不应该允许的构造函数进行隐式转换。而在C++2.0中,explicit可以支持不止一个参数的构造函数使用。decltypeautonullptr...

2020-10-10 23:01:38

C++2.0——语言新特性之Variadic Templates

variadic template 特性本身是一个很自然的需求,它完善了 C++ 的模板设计手段。原来的模板参数可以使类和函数的参数类型“任意化”,如果再加上“参数个数的任意化”,那么在参数方面的设计手段就基本上齐备了,有了variadic template 显然可以让设计出来的函数或是类有更大的复用性。因为有很多处理都是与“处理对象的个数”关系不大的,比如说打屏(printf),比如说比较大小(max,min),比如函数绑定子(bind,function要对应各种可能的函数就要能“任意”参数个数和类型)。

2020-10-09 23:56:49

C++进阶——内存管理(三)

在VC和BorlandC5.0编译器标准库内部实现中,容器的std::allocater都是通过::operator new/delete来完成的,其本质就是直接调用malloc 和 free其他什么都没有做。而GNU2.9 C++中使用的版本是std::alloc——使用了诸如pool等高级的分配逻辑,在经过更新迭代后在GNU4.9中改名为__gnu_cxx::__pool_alloc!GNU2.9中std::alloc的实现考虑到小型内存所可能造成的内存破损问题,SGI设计了双层级配置器,第..

2020-09-27 00:44:05

C++进阶——内存管理(二)

C++ memory primitives分配 释放 类型 可否重载 malloc free C函数 不可 new delete C++表达式 不可 ::operator new ::operator delete C++函数 可 allocator<T>::allocate allocator<int>::deallocate C++标准库 可自由设计并以之搭配任何容器

2020-09-25 00:27:46

C++进阶——内存管理(一)

[导语]内存管理是C++最令人切齿痛恨的问题,也是C++最有争议的问题,C++高手从中获得了更好的性能,更大的自由,C++菜鸟的收获则是一遍一遍的检查代码和对C++的痛恨,但内存管理在C++中无处不在,内存泄漏几乎在每个C++程序中都会发生,因此要想成为C++高手,内存管理一关是必须要过的,除非放弃C++,转到Java或者.NET,他们的内存管理基本是自动的,当然你也放弃了自由和对内存的支配权,还放弃了C++超绝的性能。本期专题将从内存管理、内存泄漏、内存回收这三个方面来探讨C++内存管理问题。1.

2020-09-18 00:09:18

Android开发——内存管理及内存泄漏分析

1、堆和栈要了解Android的内存,必须先从Java的堆和栈看起,我们先看看《Think In Java》中对它们的定义:(1)堆栈(stack):位于通用RAM中,但通过它的“堆栈指针”可以从处理器哪里获得支持。堆栈指针若向下移动,则分配新的内存;若向上移动,则释放那些内存。这是一种快速有效的分配存储方法,仅次于寄存器。创建程序时候,JAVA编译器必须知道存储在堆栈内所有数据的确切大小和生命周期,因为它必须生成相应的代码,以便上下移动堆栈指针。这一约束限制了程序的灵活性,所以虽然某些JAVA数据

2020-09-17 18:31:52

Android开发——Cmakelist的使用

一、背景:Cmakelist的使用项目创建好以后我们可以看到和普通Android项目有以下4个不同。main 下面增加了 cpp 目录,即放置 c/c++ 代码的地方 module-level 的 build.gradle 有修改 增加了 CMakeLists.txt 文件 多了一个 .externalNativeBuild 目录image.png二、正文第一章:CMakeLists.txt 文件 讲解2.1 一个基本的Cmakelist文件cmake_minimum.

2020-09-17 12:02:53

C++设计模式——结构型模式之代理模式(Proxy)

代理模式(Proxy):是一种程序设计最为重要的一种模式,其具体的使用非常广泛,根据它的作用,其实我们可以直接理解为中间件或者中间层,比如各类软件的中间件,软件与硬件中的中间层。Subject: 声明真实对象和代理对象的共同接口。Proxy: 代理对象与真实对象实现相同的接口,所以它能够在任何时刻都能够代理真实对象。代理角色内部包含有对真实对象的引用,所以她可以操作真实对象,同时也可以附加其他的操作,相当于对真实对象进行封装。RealSubject: 它代表着真实对象,是最终实现功能的具体对

2020-09-15 18:43:55

查看更多

勋章 我的勋章
  • 签到新秀
    签到新秀
    累计签到获取,不积跬步,无以至千里,继续坚持!
  • 阅读者勋章Lv2
    阅读者勋章Lv2
    授予在CSDN APP累计阅读博文达到7天的你,是你的坚持与努力,使你超越了昨天的自己。
  • 持之以恒
    持之以恒
    授予每个自然月内发布4篇或4篇以上原创或翻译IT博文的用户。不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
  • 1024勋章
    1024勋章
    #1024程序员节#活动勋章,当日发布原创博客即可获得
  • 勤写标兵Lv4
    勤写标兵Lv4
    授予每个自然周发布9篇以上(包括9篇)原创IT博文的用户。本勋章将于次周周三上午根据用户上周的博文发布情况由系统自动颁发。