Electronic Joint Business

Solution for E-Business

C++11

C++ 11 中的多线程

文章评价:

第一个 C++ 标准发布至今已经过去十三年了,随着新的 C++11(或称 C++0X)标准的推出,C++ 标准委员会所做出的显著改变之一就是支持多线程编程。这是首次在 C++ 语言中为并行编程提供支持,而且与平台无关。

在 C++11 标准之前,编写多线程应用需要依赖于特定的平台扩展,如 Intel TBB、OpenMP、Pthreads 等等。现在有了 C++11 的标准线程库就方便了应用移植(例如 Windows 上的 C++11 多线程应用将很容易移植到 Linux 平台),另外对于熟知 Boost 线程库的用户来说,由于 C++11 标准库中许多命名与结构都和 Boost 相同,上手非常容易。1

C++11 标准库中的类可用于线程操作与同步、公用保护数据及低层次的原子操作。

C++11 标准中涉及多线程编程的主要有四个头文件,分别是:<atomic> ,<thread>,<mutex>,<condition_variable>和<future>:

>>> 阅读全文

 

, , ,

你应该了解的 10 个 C++ 11 的新特性

文章评价:

本文 1对一些 C++11 标准中的新功能进行了探讨。这里我建议所有 C++ 开发者应该学习和使用这些特性。C++ 11 增加了许多语言特性和标准库,本文涉及的不过是皮毛。不过,我相信其中的一些新特性应该为所有的 C++ 开发人员所熟知,并在日常工作中普遍使用。网上可以找到很多类似的文章,涉及不同的 C++11 特性。这里我尝试将一些应该经常使用的 C++11 新功能串联起来。

auto
在 C++98 标准中,auto 关键字就用在存储期规范中(Storage duration: 定义了对象在内存中的最小生存时间。最常见的存储期是自动存储期:在堆栈上分配的对象是自动分配和自动释放的)。在新的 C++11 标准中,其新用途是类型推断(Type inference)。auto 现在变成了类型占位符,它告诉编译器,应该从变量的初始化式中推断出它的实际类型。auto 关键字可以在不同的作用域中声明变量如:名称空间、块、for 循环语句的初始化声明等等。

auto i = 42;        // i 为整型
auto l = 42LL;      // l 为 long long 型
auto p = new foo(); // p 为 foo* 指针

使用 auto 意味着减少代码。(除非是 int 型,这样比 auto 要少输入一个字母)。回忆以前为了遍历 STL 容器元素,你会使用 typedef 来简化迭代器的编写,现在这种方法落伍了。请看:

std::map<std::string, std::vector<int>> map;
for(auto it = begin(map); it != end(map); ++it)
{

}

请注意,auto 不能被用作函数的返回类型,不过在函数有尾随返回值(trailing return type 2)的情况下,你可以用 auto 来代替函数的返回类型。此时, auto 告诉编译器不需要推断而只是直接在函数末尾查找返回类型。比如在下面的例子中,compose 函数的返回值就是操作符+ 的返回值,该操作符用于将类型 T1 和类型 T2 的值相加。

>>> 阅读全文

 

, ,

C++11 智能指针

文章评价:

许多程序员总避免使用指针,因为一旦处理不当,就会带来很多问题。所以新手程序员都不太喜欢指针。使用指针可能会引发许多问题,例如需确保指针所引用的对象的生命周期、虚引用(dangling references)和内存泄漏。

如果某内存块为多个指针变量所引用,而其中有个变量释放了这片内存,就会造成虚引用(dangling references)。另一种情况是,程序员从堆里申请了内存块,但未进行释放,这时则会造成内存泄漏。

某些资深程序员可能会说,你看我正确地从堆里获得了内存,进行相关操作,最后也正确地释放了内存, 这段代码干净漂亮,为什么还需要智能指针呢?

void Foo( )
{
    int* iPtr = new int[5];
    //manipulate the memory block
    .
    .
    .
    delete[ ] iPtr;    
}

的确,上面的代码目前工作正常,在理想情况下也能正确地释放内存。但如果考虑运行代码时的实际环境,在内存分配与释放之间存在着许多指令,这些指令可以做一些乱七八糟的事,比如访问无效的内存位置、除零错,甚至可能你的同事修改了你的代码,添加某种条件下的 return 语句。

>>> 阅读全文

 

,