std::move

21天是肯定没法学会C++的。22天也不行。

C++11里引入了一个新的概念 :移动。 这个概念说简单其实很简单,因为它是介于拷贝和引用之间的一种概念。但还是有很多小伙伴表示不理解移动到底做了什么,如何理解移动

要想理解移动,先来介绍一个概念:左值与右值。

左值与右值

笼统来讲,左值就是能够对其取地址的值。反之就是右值(临时变量也是右值)。比如1, 2.0, true, nullptr这种纯值类型,就是妥妥的右值。再比如 int a = 100;a是左值,100是右值。在给a赋值的过程中,我们将右值拷贝到了左值。(其实并不是完全这样,编译器会做一定程度的优化,但为了方便理解,我们不考虑编译器的功劳)

两个栗子

在早期C++里,我们通常用指针或者引用来传递一个‌大变量,因为可以避免一次拷贝的开销。第一个栗子:如果我们有一个比较大的右值变量,我想将它传递给其他的函数,该如何避免/减少拷贝的开销呢?比较熟悉的朋友可能会说,我们可以传递 const & 来避免拷贝的开销。

没错,在C++11 之前,const & 可以对右值直接取引用。这样我们可以传递引用来避免拷贝的开销。那么下一个栗子就是,如果我们有一个比较大的右值变量,我想将它传递给其他的函数,‌又想要修改这个右值变量的值,该如何避免/减少拷贝的开销呢?

C++11 提出了一个概念:右值引用。语法是两个&。 它允许我们对右值进行直接引用。

移动

理解了右值之后,我们来思考一个问题。当我们进行赋值语句时,其实是构建了一个右值,然后复制给了左值。那么有没有花销更小的方法呢?答案就是移动

熟悉C++的都知道C++中有构造方法。构造方法又有拷贝构造赋值构造两种特殊的构造方法。C++11提出了新的构造类型:移动构造。也即方法接受的参数是一个右值,然后通过移动的方式,减少拷贝与销毁的开销,实现资源的转移。样式为: Type::Type(Type && rval)

另一个作用就是,std::move在移动的时候,可以 剥夺原变量的数据所有权。通常进行所有权转移时我们会显式调用std::move 方法。

vector来举例。

vector<int> a {1,2,3,4,5};
for (auto i : a){
    cout << i<< ", ";   // --> 1, 2, 3, 4, 5   
}
vector<int> b  = move(a);

for (auto i : a){
    cout << i<< endl;   // Nothing, moved to b
}
cout << "----" <<endl;
for (auto i :b){
    cout << i<< ", ";   // --> 1, 2, 3, 4, 5   
}

联通

C++ 11 中的移动语义使得我们在构造临时变量,减少构造与析构的消耗,并且可以显示表达所有权的转移。既增强了代码的运行效率,又增加了代码的可读性。

move不产生新变量,它只是c++的搬运工。

华为手机

科技博主来蹭政治热度了

昨天收到了一个朋友的微信消息:

XX,请教你下,这次Google禁华为,到底是哪些功能不能用了?我没大看明白:一个是以后的OS都不更新?然后所有Google 的apps 都禁止下载?那访问呢,比如已经下好的apps?

为了防止消息不准确造成的错误解读,我是等到了今天白天看了一圈新闻之后才打算写这个博文的。

首先回答下小伙伴的微信:

  • 哪些功能不能用:Google play,GMS 等Google原生的app
  • 以后的OS都不更新?:不,按照现在的Android 开源授权,依旧会有更新,只是没有办法预览新系统。
  • 所有的Google apps都禁止下载?:应该是
  • 访问已经下好的apps?这点没有任何确认的消息,有可能已经存在的app可以继续使用,也有可能无法访问服务器了。

接下来谈一谈短期与长期的影响。

短期影响:

对于国内来说,这个短期内几乎没有影响。毕竟国内用不了Google 全家桶这已是既定事实了,那官宣不支持也没有什么大影响。毕竟大部分服务在国内已经有了本土化的替代品。而从操作系统上来说,Android 是开源的,所以华为短期内依旧可以用Android,受益于Android生态。

对于国外来说,这个影响就比较大了。不能用Google 全家桶的Android 手机基本上就是一个只能打电话发短信的功能机了。而且在国外又缺少一套完整的可以替代Google 全家桶的生态,所以在欧洲等地,可以预见华为手机销量的下跌。

长期影响

长期来说,没有了官方合作关系,那么华为没法获得新系统的官方支持、预览等。适配等工作都需要正式版系统版本发布之后才能进行。换句话说,可能一加都已经用了半年的新Android,华为这边才适配好。另外Google也随时有可能更改开源授权来彻底禁止华为使用Android,所以长期来看对于华为影响还是很大的。

但是从好的方面来看,华为的技术独立准备的相当充分。方舟,海思芯片,自研OS等都表面了华为“高筑墙,广积粮,缓称王”的战略思想。也许经此事件,华为 OS会成为第三大移动操作系统。

科学没有国界,但科学家有祖国。同样,技术无国界,但公司有国界。祝愿华为手机继续大卖,技术独立。

最后不替东家洗个地:你们知道Apache也对华为停止合作了么?

所有权与智能指针

没错,技术博主开始写技术文了

从我开始学C/C++的时候,指针和内存管理就是最让我头疼的东西:要么是忘了释放内存造成内存泄露,要么是多重释放造成了访问失败。甚至有些时候一个方法有多个返回语句的时候还要在每一个返回语句前释放一下内存。当时就在想为什么不能像Java一样有一个智能的垃圾回收器,来管理所有的内存呢。

这个痛点一直困扰到我开始学STL。原来STL早就考虑到手动释放内存的繁琐,所以提供了多种智能指针:auto_ptr, unique_ptr, shared_ptr, weak_ptr,并引入了“所有权”这个概念。大大简化了工程项目中的内存管理。也让我意识到我学的是假C++,真C(菜)。

所有权

单一所有权

两句话:所有权的拥有者有义务释放内存或转移所有权。同一时刻只会有一个所有权拥有者。

共享所有权

和用裸指针一样,所有权的拥有者不必负责释放内存,引用计数器会负责释放内存。同一时刻可以有多个所有权拥有者。

unique_ptr

重要的事情说三遍:

unique_ptr 不能被拷贝

unique_ptr 不能被拷贝

unique_ptr 不能被拷贝

unique_ptr 的所有者即为单一所有权的拥有者,因此它无法被拷贝。如果需要转移所有权,需要显示调用 move(unique_ptr) 来转移 或者 unqie_ptr.release() 方法放弃所有权。在生命周期结束时,若 unique_ptr 依然是所有权的拥有者,它会立刻释放掉对应的资源。示例:

unique_ptr<A> a = make_unique<A>();
unique_ptr<A> b = a; // can not assign unique_ptr to other unique_ptr
unique_ptr<A> c(a);  // can not copy unique_ptr
unique_ptr<A> d(a.release()); // OK, a release the resource
unique_ptr<A> e = move(a); // OK, a transfer ownership to e

与裸指针不同,单一所有权明确了资源的所有者,确定了资源该于何时被释放,增强了代码的可读性。当然,传递 unique_ptr 引用这种合法不合理的事也别干,要么直接 move 过去,要么只提供 unique_ptr.get() 但不转移所有权。

小惊喜:试试 std::set<unique_ptr>,有惊喜。

shared_ptr

shared_ptr 在使用上更像裸指针,不同的地方就是它内部有一个引用计数器,记录了有多少共享所有权的拥有者。当计数归零,它会自动释放掉资源。它的优势是比 unique_ptr 更灵活,在很多需要共享资源的场景(比如多线程共享物件),它符合场景的需求。并且活用 shared_ptr最后走的人关门特性,在某些多线程应用的场景里可以实现会话结束通知,更新标记等功能。

彩蛋:

const unique_ptr<T> & make the world a better place

狼人杀与一夜狼人杀

与麻将,北美玩家的周末三俗活动系列

我常常自诩是一个桌游爱好者,尤其是卡牌类游戏,从3C到三个杀都玩的还OK。唯独有一类桌游我特别不擅长,就是狼人杀这类开局一张嘴,游戏全靠编的(好吧,如果算上麻将的话是两类)。

上周接触了一夜狼人杀,游戏体验嘛,很一言难尽。比起狼人杀,它解决了第一轮被杀的玩家冷板凳的不良体验。但是对于新人来说,尤其是村民身份的时候,大多时候都是一种“我是谁?”“我在哪?”“我在干嘛?”的状态。加之缺少狼人杀每轮死掉一名角色的“确定”证据,整局游戏就像在猜薛定谔的身份。

职业所需,我经常要梳理清别人的需求并且上下文代入以便分析问题。这使得我从习惯上会假定别人说的都是对的,然后就被带到沟里了。再加上不擅长嘴炮类游戏,常陷入一种唉听着这个人说的有道理,下一个说着与之相反的逻辑,听听也挺在理。最后看谁说的都有道理,只好finger cross & “跟谁熟就跟谁投吧”。

啰嗦了这么多,归根结底还是理工男讷于言敏于行且不善打嘴炮的美德导致我没有很擅长这个游戏(对,真的不是我菜,是这游戏不是我的菜)。

Option and future

选择与未来——从不灌鸡汤的角度来聊聊刷题与IT

最近有几件事让我觉得应该谈谈职业选择/发展。一是听说前东家又有同事溜了,一个组流动性高达40%;二是有小伙伴问如何准备面试;最后是昨天收到一个小朋友的求助,关于如何选择职业。

从我个人角度来说,我是很幸运的。能把爱好当作职业。从大环境来讲,IT仍是目前极具竞争力的行业。尤其在955的环境下,少了996的疲于奔命,多了更多的时间可以支配。当然从另一方面来说,职业发展不在工作的8小时内,下班后依然要学习工具/技术。

选择:跳?不跳?

北美IT圈有一个惯例,每年3-6月是跳槽的高峰期。原因有四,一来3月左右,前一年的奖金/股票已经到手,跳槽的机会成本比较小;二是跳槽成功会有一个比较高的签字奖励(现金 + 股票)和涨薪;三是新公司招人一般是做一些新产品,相比在现在公司做维护,开发新品对未来的职业发展更有帮助;最后就是,跳槽可能会顺便升一级。

不跳槽的原因,最多的就是因为身份。比如被绿卡/h1b牵扯住了之类的。少数的是因为懒或者怕学新技术。也有的因为有机会当team lead/tech lead。当然在IT圈逐渐咖喱化的今日,上升管理的通道逐渐减少,甚至有很多同行提出了“不求升职但求加薪”的口号。

一个无奈但真实的情况是,大多数人都是通过准备面试来学习新技术/工具/算法。从另一个角度来说,跳槽热提高了整体行业水平(?)

未来:去哪里刷题?

不论跳槽成功与否,生活总还是要继续的。失败的再接再厉,准备下一年的面试。跳槽成功的,基本上还是在准备面试,为了下一轮跳槽。于是生活陷入了每N(N <=4)年一次的跳槽刷题循环,或是困局。(为什么是4年?因为大多给股票的公司是分4年拿清,提前走的话损失比较大)(AMZN就别说话了)

选择与未来

从好的方面看,IT行业流动性比较高,试错成本相对较低。不会一步走错,十几年没机会跳出来。相比于传统行业比如金融,IT跨产品的机会更多。从后端转mobile,前端转AI,甚至码工转房产经纪的比比皆是。但同样,坏的方面就是行业壁垒几乎不存在,老人被新人倒挂情况屡见不鲜。而且随着年龄增长,学习能力走下坡路加上新工具层出不穷,在市场上的竞争力会逐渐下降。就算去了Oracle,依然会在多年后被N+6。

最后,不能怕去做选择(尤其是怕选错)而止步不前,因为唯一不变的只有变化本身;也不要担心陷入刷题循环的怪圈,毕竟IT行业除了脱发,没有其他太多的缺点。

借用一句话来总结:张华在脸书当数据科学家;李萍在CMU读CS Phd;我在刷题找工作:我们都有光明的前途。

当我们谈论IO的时候我们在谈论什么

又是一年IO大会。自从乔布斯带火了科技产品发布会,越来越多非技术相关的小伙伴开始关注WWDC,Build,还有IO这类的科技产品发布会了。

昨天科技圈的老大哥发布了微软终端,24小时内github点星超过6000,俨然有官方逼死同人的节奏(默哀putty 两秒)。今天就迎来了IO19,发布了一系列看起来还不错的产品。

Android 10

Android 秉承着每年一更新版本,成功的拖死了CyanogenMod等第三方Rom。今年也不出意外的更新了Android。带来了……

夜间模式(再也不怕晚上玩手机伤眼睛了,现在只伤肝)。

对折叠屏优化(三桑的Fold卡顿的话是他们自己优化不好,不怪Android)(对,只是软件优化,Fold屏幕的问题跟Google 没关系)

支持5G(反正今年你也用不上)

专注模式(妈妈再也不用担心打游戏的时候有人找我聊天了,女生也不行)

实时字幕(下回和歪果仁聊天不用往下看了,看手机就行。真的有字幕。)

充电15分钟,通话7小时

Pixel 3a

小米9 的价钱,pixel 3 的体验。plus 3a 和3aL 有耳机孔,配合pixel 3 的ai优化相机,压箱底的耳机线控自拍杆又可以拿出来用了。

Assistant

Duplex(现在不仅可以帮你预约理发师,还可以帮你租车)(所以这是要我先去剪头再去rodetrip?)

车载设备——喊一声Hey Google let’s drive就可以进入驾驶模式(所以我路怒的时候它能替我问候前面司机的亲属?)

$ sudo mv “Google Home hub” “Nest Hub”

视觉搜索

AR路标(终于解决即使用Google map也因为罗盘不准结果走错方向的问题了?)

AR 购物(不用再因为陪女友逛街脚痛了)(只剩信用卡被刷爆之后肾疼了)

AR 相机(圣诞节不用买树了,AR 摆一颗就行。environment friendly)

菜单搜索(因为你朋友喜欢吃blue cheese所以你也一定喜欢吃blue cheese)(算法比你更懂你)

收尾

IO19 秉承了Google 一贯的AI first 原则,大部分展示的新产品都是AI驱动,展现了AI能够带来的一整套生态系统:拿着新买的Pixel 3a,从预约理发,租车,用Google Map找到停车场,导航到理发店理发,最后去餐厅,因为餐厅太吵需要用live captions 交流点餐吃饭的全套流程。

一颗韭菜的自我修养

美国的韭菜也是韭菜

这几天一件大事就是川普在北京时间5.6号又双叒叕宣布要加进口税了。此言一出A股立刻狂泄了6个点。12小时后美股开市,SP500 盘前跌了1.24,nasdaq盘前跌了2.24。

真是不怕美联储加息,就怕川普发推。

由于我大部分的股票都是科技股,在此次发推事件中受创超过4 个点(我还买了3x nasdaq,之前涨的美滋滋,现在跌的都想卸软件了)。辛辛苦苦一个月,一推回到解放前。

前几天和前同事约了个饭。他给我讲了很多币圈割韭菜的手法。我当时还嘲笑说韭菜真好割,结果今天自己也被收割了一波。

世界文化大同嘛,韭菜在哪都是韭菜,区别是这茬割完了下茬被不被割的区别。

删错站了

之前一直有一个andysim.us的域名托管在digital ocean。后来建了个其他的实例来玩k8s虚拟化什么的,玩完了也忘了删。几个月过去就发现每次都收到之前双倍的账单(其实两倍多,毕竟k8s比wordpress 吃资源吃的多)。然后昨天心血来潮就上了下DO把其中一个实例给删了。

删了之后就收到了wordpress 的警报说我的网站下线了。当时就急出一身汗。后来发现没有做业务和数据分离(就一wp网站还搞业务分离?),也没开实时备份所以数据就找不回来了。广大同胞们请务必吸取我这个不爱加标签的教训。

既然找不回来了,那人生也只好向前看了。这个站我换了个托管网站,只做wp的。比DO便宜一些,而且还提供免费的备份功能。性能孱弱一些(想要性能可以去搞GCP)但是用来host wp是够用了。

之前有一些刷题记录是准备面试时用来练手的,现在也停了。以后这个站拿来写写周记,学习笔记什么的吧。

祝大家五一后的工作日快乐,笔芯❤️。