C++11的一般概念——The C++ standard library, 2nd Edition 笔记(二)
2014-01-17 07:40
274 查看
( 原书第四章,General Concepts)
只介绍新内容,关于头文件格式和后缀等C++03已经规范化的内容,不再赘述。
namespace std:新的std子空间包括:
std::tr1, tr1 = technical report 1;
std::rel_ops, 用==和<运算实现所有比较运算的operator定义;
std::chrono, 精度无关的时间库chrono的名字空间;
std::placeholders, bind模板的占位符名字空间;
std::regex_constants, 指定regex类型和特性的常数的名字空间;
std::this_thread, 提供特定线程信息的全局线程函数的名字空间;
错误和异常处理:string的错误处理非常细致,而stl和valarry更倾向于时间优化,所以基本不检查逻辑错误。
可调用对象(Callable Objects):通过某种方式可以调用某种功能的对象,包括函数,(成员)函数指针,函数对象和lambda。
并发和多线程:C++11在语言层面和标准库上,对并发编程都提供了很好的支持。下列前两点为核心语言层的支持。
新的内存模型,独立更新两个不同线程中的不同对象是互相独立的。奇怪了,独立对象在不同的线程中怎么可能会有访问冲突?详情请看这里。
thread_local关键字的引入,就是线程局部存储,Windows中的TLS系列函数或者Linux下的pthread_key_t;
与线程安全性相关的一些保证;
多个线程共享一个库对象,并且至少一个线程要修改它,可能会导致未定义行为;
一个线程正在构造对象,而另一个对象已经开始使用它,或者一个线程还在使用对象,而另一个线程已经开始析构它了,都会导致未定义行为。
STL容器和容器适配器提供两点保证:1, 只读的并发访问是安全的; 2, 对于同一容器中的不同元素进行访问是安全的,vector<bool>除外(因为它是通过代理对象实现的。)
与stdio同步的标准流的并发访问是安全的。但是,stringstream, file stream或者stream buffer, 并发访问的行为未定义。
atexit()和at_quick_exit()的并发调用会被同步。new,terminate或者unexpected的handler也会被同步。getenv()也是同步的。
支持并发函数库和类库(线程启动和同步,第18章介绍);
allocator的简要介绍:它是某种特定内存解决方案的基础,比如共享内存,垃圾回收和面向对象数据库。关于默认的allocator,可参考《C++标准程序库》chapter 15.
只介绍新内容,关于头文件格式和后缀等C++03已经规范化的内容,不再赘述。
namespace std:新的std子空间包括:
std::tr1, tr1 = technical report 1;
std::rel_ops, 用==和<运算实现所有比较运算的operator定义;
std::chrono, 精度无关的时间库chrono的名字空间;
std::placeholders, bind模板的占位符名字空间;
std::regex_constants, 指定regex类型和特性的常数的名字空间;
std::this_thread, 提供特定线程信息的全局线程函数的名字空间;
错误和异常处理:string的错误处理非常细致,而stl和valarry更倾向于时间优化,所以基本不检查逻辑错误。
可调用对象(Callable Objects):通过某种方式可以调用某种功能的对象,包括函数,(成员)函数指针,函数对象和lambda。
void func(int x, int y); auto l = [](int x, int y){...}; class C { public: void operator()(int x, int y); void memfunc(int x, int y); } int main() { C c; std::shared_ptr<C> sp(new C); std::bind(func, 3, 7)(); // 注意(); func(3, 7) std::bind(C(), 3, 7)(); // C()(3, 7); std::bind(l, 3, 7)(); //l(3, 7); std::bind(&C::memfunc, c, 3, 7)(); // c.memfunc(3, 7); std::bind(&C::memfunc, sp, 3, 7)(); // sp->memfunc(3, 7); //async 表示后台线程执行 std::async(func, 3, 7); // 注意(); func(3, 7) std::async(c, 3, 7); // c.operator()(3, 7); std::async(l, 3, 7); //l(3, 7); std::async(&C::memfunc, &c, 3, 7)(); // c.memfunc(3, 7); std::async(&C::memfunc, sp, 3, 7)(); // sp->memfunc(3, 7); }
并发和多线程:C++11在语言层面和标准库上,对并发编程都提供了很好的支持。下列前两点为核心语言层的支持。
新的内存模型,独立更新两个不同线程中的不同对象是互相独立的。奇怪了,独立对象在不同的线程中怎么可能会有访问冲突?详情请看这里。
thread_local关键字的引入,就是线程局部存储,Windows中的TLS系列函数或者Linux下的pthread_key_t;
与线程安全性相关的一些保证;
多个线程共享一个库对象,并且至少一个线程要修改它,可能会导致未定义行为;
一个线程正在构造对象,而另一个对象已经开始使用它,或者一个线程还在使用对象,而另一个线程已经开始析构它了,都会导致未定义行为。
STL容器和容器适配器提供两点保证:1, 只读的并发访问是安全的; 2, 对于同一容器中的不同元素进行访问是安全的,vector<bool>除外(因为它是通过代理对象实现的。)
与stdio同步的标准流的并发访问是安全的。但是,stringstream, file stream或者stream buffer, 并发访问的行为未定义。
atexit()和at_quick_exit()的并发调用会被同步。new,terminate或者unexpected的handler也会被同步。getenv()也是同步的。
支持并发函数库和类库(线程启动和同步,第18章介绍);
allocator的简要介绍:它是某种特定内存解决方案的基础,比如共享内存,垃圾回收和面向对象数据库。关于默认的allocator,可参考《C++标准程序库》chapter 15.
相关文章推荐
- C/C++使用Lu扩展动态库
- 用C/C++设计Lu扩展动态库
- c++课程设计
- 中介者模式----C++实现
- VC++ 响应回车键的2种方法
- c++ 运算符优先级
- C语言运算符表
- [C++ Basic] Const 用法
- C++ 流的重载
- c转C++的一点感想
- Ubuntu下搭建eclipse C/C++开发环境 [2014-01-16更新]
- win7下的eclipse cygwin cdt 搭建C/C++环境
- 浅谈C/C++内存泄露及其检测工具
- 【GamingAnywhere源码分析之知识补充一】静态链接库与动态链接库
- 用Visual C++打造自己的资源管理器
- c++编程命名规范
- 部分转载:如何实现C和C++函数互相调用
- STL list
- BSDSocket 常用设置
- c++构造函数的初始化列表