C++的多线程

C++11 新标准中引入了四个头文件来支持多线程编程,他们分别是<atomic> ,<thread>,<mutex>,<condition_variable>和<future>。 <atomic>:该头文主要声明了两个类, std::atomic 和 std::atomic_flag,另外还声明了一套 C 风格的原子类型和与 C 兼容的原子操作的函数。 <thread>:该头文件主要声明了 std::thread 类,另外 std::this_thread 命名空间也在该头文件中。 <mutex>:该头文件主要声明了与互斥量(mutex)相关的类,包括 std::mutex 系列类,std::lock_guard, std::unique_lock, 以及其他的类型和函数。 <condition_variable>:该头文件主要声明了与条件变量相关的类,包括 std::condition_variable 和 std::condition_variable_any。 <future>:该头文件主要声明了 std::promise, std::package_task 两个 Provider 类,以及 std::future 和 std::shared_future 两个 … “C++的多线程”

Read More

C++11之Lambda与bind

Lambda语法和stl::bind 都是语法糖,但不得不说它们的作用很出色: 1. 更方便的定义匿名函数 2. 更简洁的代码逻辑 3. 更安全的私有函数 这称之为closure,即闭包. Lambda 表达式语法有如下五种形式: [capture](parameters) mutable throw() ->return_type {body} [capture](parameters) mutable ->return_type {body} [capture](parameters) ->return_type {body} [capture](parameters) {body} [capture] {body} capture []用于标识一个lambda的开始,其中可以存在零个或多个捕获参数,用逗号分隔.并且只允许以下两种标识符表示: & 引用值 = 拷贝值 对于参数的形式可以有: 1. … “C++11之Lambda与bind”

Read More

C++11之for

C++11中新加了基于范围的for循环,可以对集合/数组/初始化列逐个访问,这种用法在其他高级语言里早有实现,现在C++终于支持了. for的新特性是的代码更加的简洁: //原来的方法 for (std::vector<int>::const_iterator itr = myvec.cbegin(); itr != myvec.cend(); ++itr) //C++11中auto和for新特性结合 for (auto& x : myvec) 简直屌爆了有木有. 对于自定义的集合类型支持foreach,只需实现begin和end函数即可,因为内置的STL模板会自动适配: template <typename Container> auto begin (Container& cont) -> decltype (cont.begin()); template <typename Container> auto begin … “C++11之for”

Read More

C++11之auto与decltype

auto 看介绍,auto实际上是在编译期间就对变量进行了类型推导,所以在程序的实际运行过程中不会对运行效率产生影响.因此可以说auto就类似一个占位符,只不过在编译期间被替换为实际的类型. auto最大的作用应该就是将代码变得简洁,易读.比如在使用迭代器的时候,通常需要写一大串的类型,而此时只需要使用auto即可: for (std::vector<int>::const_iterator itr = myvec.cbegin(); itr != myvec.cend(); ++itr) //使用auto for (auto itr = myvec.cbegin(); itr != myvec.cend(); ++itr) 但是最好不要在接收函数的返回值时使用auto,这会降低代码的可读性: sometype var = func_xxx(var); auto var = func_xxx(var); decltype decltype可以在编译期间确定表达式的类型,比如: int v1; … “C++11之auto与decltype”

Read More

C++11之constexpr

突然发现C++14都要出来了,然而我居然还没仔细的去了解C++11,飘了飘了… 在网上搜了下C++11的相关文章,感觉酷壳的这篇文章介绍的比较好. 然后发现constexpr这个C++11中新出现的关键字介绍比较少,于是就谷歌了一番,做了点总结. constexpr的含义为常量表达式,编译器在编译期间就能求值,因此只能用常量或者常量表达式来初始化.这是一种很强的约束,能保证程序的语义不会受到破坏,并且相比于宏而言,它更安全。 constexpr函数的限制有: 函数必须有返回值. 函数必须存在定义. 函数中仅能有一个return,但允许包含typedef、 using 指令、静态断言等. 只能调用其它constexpr函数或constexpr变量. constexpr函数可以使用递归: constexpr int recursion(int n){ return n > 10 ? recursion( n + 2 ) : 10; } 构造函数的常量表达式限制有: 1. 函数体必须为空 2. 初始化列表只能由常量表达式来赋值 class … “C++11之constexpr”

Read More