陈良乔 《我的第一本C++书》 华中科技大学出版社 2011年5月第1版
p321: 因为shared_ptr需要进行引用计数,所以它需要额外的内存空间来保存当前内存资源的引用计数,这使得一个shared_ptr指针将占用40个字节的内存,是一个普通指针所占内存空间的10倍。
shared_ptr在运行时要对引用计数进行管理和维护,影响性能。另一方面,shared_ptr使用了大量的虚函数,虚函数的使用也带来了一定的性能损失。
unique_ptr避免了shared_ptr的体积问题和性能问题。unique_ptr不能复制(因为它是独享管理权的)。
p328, p341:
PPL是微软在Visual C++ 2010中引入的简化多线程应用程序开发的编程模型。
PPL要用并行算法或并行任务对程序进行改写。而OpenMP(open mulit-processing)可以无需对程序进行改写直接将一个串行程序并行化。对基于并行数据的多线程程序设计,OpenMP是一个很好的选择。线程粒度和负载平衡等是传统多线程程序设计中的难题,但在OpenMP中,OPenMP库从程序员手中接管了部分这方面的工作。
使用OpenMP很简单:
在编译器选项中启用对OpenMP的支持。
包含头文件 #include <omp.h>。
用prama指令说明这是一个可以并行的for循环,
#pragma omp parallel for
for ( int i = 0; i < 100; ++i ) {
std::cout << i << std::endl;
}
更重要的是,还可以通过取消编译器对OpenMP的支持,让pragma指令失去效用,使程序退化成一个串行化的程序。这个程序员提供了极大的灵活性。
p365:
这个函数居然是计算整数的二进制表示中有多少个1的。
int func(int x)
{
int countx = 0;
while ( x ) {
++countx;
x = x & ( x-1 );
}
return coutnx;
}
x是unsinged int也行
p366:
3个人一起住酒店,每个人出10块钱,一共30块钱,经理说今天优惠,只要25块钱,叫服务生退5块钱给他们,服务生从中藏了2块钱进了自己的腰包,找回每个人1块钱,那么,3x(10-1)+2=29, 丢失的那1块钱到哪里去了呢?
我的解答:
3个人花了3x(10-1)=27块钱,小二得到2块钱,这都没错。
事情分2个步骤:
第一步:开始有一个客人付了30块钱,设想有30个一块钱的硬币,编号为1~30,放到了经理口袋中,
第二步:经理掏出26、27号硬币给了小二,把28、29、30号硬币给了客人。
叙述和原题不同,但是对题目而言显然是等价的表述,要有意地简化不必要的信息
1. 原算式的意义:
现在的局面是经理口袋里有编号1~25的硬币,小二口袋里有编号26、27号的硬币,客人口袋里有编号28、29、30的硬币。
这27块钱都用在哪儿了,是不是一目了然了。现在请问27+2表示什么?显然是 (经理的钱+小二的钱) + 小二的钱, 没什么含义,加了2次小二的钱,不知道出题人想算什么。
进一步去掉干扰信息,题目还可以简化成:客人付了30块钱给酒店,酒店返还了3块钱给客人。问:客人实际花费27块钱 + 小二今天的奖金 为什么不等于客人最开始付给酒店的钱?! 这显然是荒谬的问题。
2. 30块钱的构成:
30块是刚才花出去的钱,27块是现在实际花出的钱。 二者的关系是且仅是:刚才花出去的钱 - 返回自己的钱 = 现在实际花出去的钱。
也即,30块钱 = 现在客人实际花出去的钱27块 + 刚才返回给客人的钱(3块)。
经理和小二的钱的总和已经是这个27块的构成部分,在小二和经理之间怎们分配对于此处讨论的30块钱的构成分析没有半毛钱的关系,唯一有用的是流回客人口袋里多少块钱。
题目还可以改成经理优惠了10块,小二给客人3元,截留了7块;经理优惠25块,小二给客人3元,截留了22块。于是糊涂的等式还可能是 27+7 = 30 ? 27+22 = 30 ? 其实跟这27块钱在经理和小二之间如何分配一点关系都没有。
不知道我说清楚了吗?