C++11简单整理

C++11中 静态成员构造的时候线程安全的:static Database database;
1、static_assert静态断言发生在编译期,发现错误,(模板中使用较多,或者一些常量)
static_assert(sizeof(a) == sizeof(b), “parameters must have same width”)
2、noexcept修饰函数不抛出异常,编译器为析构函数默认是不抛出异常的
3、快速初始化成员变量:使用=或{}在类内除进行初始化
4、final/override
final修饰类为不可继承,修饰函数不可重写
override修饰函数为重写函数(提醒作用)
default:使用编译器提供的默认的构造函数
deleted:删除编译器提供的函数
nullptr:指针空值,消除字面常量0二义性、提升可读性健壮性
using关键字:的能力包括了typedef的部分,using uint=unsigned int;别名
auto:自动类型推倒
typeid(a).name():返回a变量类型的名字
decltype()推导返回类型,其成员不会继承const和volatile限制符
for(auto var:vectors)范围for循环
constexpr常量表达式、常量表达式函数、编译时常量,运行时常量
5、继承构造函数using A::d();
委派构造函数:是在参数列表中执行


6、右值引用:消除临时对象销毁的效率
右值:临时对象,函数返回值,运算表达式结果,字面值常量
将亡值(被右值引用绑定的右值为将亡值)
右值引用意义:对将亡值进行引用,实现移动语义
避免 先拷贝再废弃 替换成移动,所带来的性能浪费
左值和右值都是引用类型,都必须初始化,引用左值为别名,右值引用为匿名变量的别名
解决临时对象的资源浪费
可以通过move将左值抓话为右值,用于移动语义


7、完美转发:forward<T>(t)
指在函数模板中,完全依照模板的参数类型将参数传递给函数模板中
调用的另外一个函数
8、强类型枚举:enum class Type:char{red,green,};
:强作用域、转换限制、可以指定底层类型
9、智能指针:堆内存管理与回收
问题:野指针、重复释放、内存泄露
unique_ptr\shared_ptr\weak_ptr来自动回收堆分配对象
unique_ptr<int> up1(new int(1));独占指针不允许赋值只能move
shared_ptr有引用计数,当引用计数为0的时候释放内存
weak_ptr可以指向shared_ptr指针指向的对象内存,确不拥有该内存
weakptr用于解决循环引用问题
通过lock成员返回其指向内存的一个shared_ptr对象,对象内存无效时返回空指针
用来验证shared_ptr的有效性、和解决循环引用问题

垃圾回收方式:1、基于引用计数 2、基于跟踪处理的垃圾回收器

10、变长模板、模板参数可变、典型应用tuple
tuple<int,double,char>


11、并行编程库thread:可以不再是使用POSIX繁琐的库
原子操作:最小的且不可并行化的操作,多个线程对一个共享资源操作,
有且只有一个现成可以操作资源,其他线程阻塞
为了保证原子性,需要使用互斥量mutex进行对资源的锁定
为了防止线程间对数据的竞争,需要确保对数据的操作是原子性的
atomic模板类std::atomic<T> t;我们可以直接定义一个原子操作的数据
互斥量、条件变量、原子变量
异步操作:
future:作为异步结果的传输通道,获取线程函数返回值(通过future状态获取操作结果)
promise:用来包装一个值,将数据和future绑定起来,方便线程赋值
packaged_task:用来包装一个可调用对象,将函数和future绑定起来,以便异步调用
线程异步操作函数async


12、线程局部存储TLS:拥有线程生命期及线程可见性的变量
(例子error code是全局的,但是每个线程都会有errorcode)
int thread_local errCode;
线程模型:线程会拥有自己的栈空间,但是堆空间和静态数据区是共享的
(全局、静态变量data\bss)
13、快速退出:quick_exit at
terminate()没有被捕捉的异常会导致该函数调用,然后调用abort()异常终止程序不
abort()异常退出、不调用析构函数
exit()正常退出、调用析构函数


14、lambda函数:匿名函数[](int a,int b){return a+b}
15、unicode支持
char:UTF-8
char16_t:UTF-16
char32_t:UTF-32
常量字符串编码格式前缀:u8\u\U
char16_t utf16[]=u"hello";
char32_t utf32[]=U"hello eqyak";
16、原生字符串字面量:所见即所得,转义字符不起作用
R"(hello \n world)"
17、增加无序容器 unordered_set map multiset multimap底层使用hash_table


线程池:预先创建一定数量的线程,当任务请求到来时从线程中
分配一个预先创建的任务去处理,完成后不会销毁
避免大量的创建和销毁消耗过多的系统资源
同步服务层,用来处理来自上层任务请求,将请求放入同步队列中
多个线程从队列当中取出任务并行处理
异步操作:



#include <iostream>
#include <future>
using namespace std ;

int func(int x) { return x + 2; };

int main()
{
    //线程操作的返回值
    std::promise<int> pr;
    std::thread t([](std::promise<int>& p)
    {
        p.set_value_at_thread_exit(9);
    }, std::ref(pr));
    t.join();
    std::future<int> f = pr.get_future();
    auto r = f.get();
    cout << "r = " << r << endl;

    //异步操作的返回值
    std::packaged_task<int()> task([]() { return 7; });
    std::thread(std::ref(task)).detach();
    std::future<int> f1 = task.get_future();
    auto r1 = f1.get();
    cout << "r1 = " << r1 << endl;

    //async
    auto a = std::async(std::launch::async, func, 6);
    cout << "func () a = " << a.get() << endl;

    auto ff = std::async(std::launch::async,
                         [](int a, int b)
                         {
                             std::this_thread::sleep_for(chrono::seconds(6));
                             return a + b;
                         }, 2, 3);
    cout << "async start" << endl;
    cout << "ff = " << ff.get() << endl;//阻塞
    cout << "async end" << endl;
    system("pause");
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值