c++ smart pointer

陈良乔 《我的第一本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块钱在经理和小二之间如何分配一点关系都没有。


不知道我说清楚了吗?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值