Wednesday, June 5, 2013

this指针是非左值的表达式

闲逛statckoverflow,有个问题是this指针到底是存在哪里的,栈,堆,还是代码段中?


this表达式


下面有个哥们给出了比较权威的解释:


C++ ISO的规范里面说



In the body of a nonstatic (9.3) member function, the keyword this is a non-lvalue expression whose value is the address of the object for which the function is called.

值得注意的是this并不是一个变量,它是一个表达式,就像1+2一样。而表达式的值可以存在任何地方,栈,寄存器,堆等,具体取决于编译器。即this是一个值为指针的表达式。


lvalue和rvalue


看到了non-lvalue的时候我自然就想到不就是rvalue么,也不知道为啥这么说,为了了解为何这么说(还是木有了解,可能是习惯?),又去看了下lvalue和rvalue,来自51CTO的一篇文章解释的不错,摘抄如下。


术语 “L-Values” 和 “R-Values” 是很容易被搞混的,因为它们的历史渊源也是混淆。他们最初起源是编译器的设计者,从字面上来理解就是表达式左边的值和表达式右边的值。它们的含义一直在演化而名字却没变,现在已经“名”不副“实”了。虽然还是称为left-value 和right-value,但是他们的含义已经大大不同了。


C++ 03 标准上是这样写的: “每一个表达式要么是一个 lvalue,要么就是一个 rvalue。”


记住,lvalue和rvalue是针对表达式而言的。


lvalue 是指那些单一表达式结束之后依然存在的持久对象。例如: obj,*ptr, prt[index], ++x 都是 lvalue。


rvalue 是指那些表达式结束时(在分号处)就不复存在了的临时对象。例如:1729 , x + y , std::string(“meow”) , 和 x++ 都是 rvalue。


++x 和 x++ 的区别的语义上的区别: 当写 int i = 10 ; 时, i 是一个 lvalue,它实际代表一个内存里的地址,是持久的。 表达式 ++x 也是一个 lvalue,它修改了 x 的值,但还是代表原来那个持久对象。但是,表达式 i++ 却是一个 rvalue,它只是拷贝一份i的初值,再修改i的值,最后返回那份临时的拷贝,那份拷贝是临时对象。 ++i 和 i++ 都递增i,但 ++i 返回i本身,而 i++ 返回临时拷贝。这就是为什么 ++i 之所以是一个 lvalue,而 i++ 是一个 rvalue。


lvalue 与 rvalue 之分不在于表达式做了什么,而在于表达式代表了什么(持久对象或临时产物)。 判断一个表达式是不是 lvalue 的直接方法就是“能不能对表达式取址?”,如果能够,那就是一个 lvalue;如果不能,那就是一个 rvalue。


参考文献



  1. Where is the ‘this’ pointer stored in computer memory?

  2. C++左值与右值之间共同与不同点解析






via WordPress http://www.econsh.com/2013/06/this%e6%8c%87%e9%92%88%e6%98%af%e9%9d%9e%e5%b7%a6%e5%80%bc%e7%9a%84%e8%a1%a8%e8%be%be%e5%bc%8f/?utm_source=rss&utm_medium=rss&utm_campaign=this%25e6%258c%2587%25e9%2592%2588%25e6%2598%25af%25e9%259d%259e%25e5%25b7%25a6%25e5%2580%25bc%25e7%259a%2584%25e8%25a1%25a8%25e8%25be%25be%25e5%25bc%258f

Thursday, May 16, 2013

好友记-北京小聚会

mark一下,奥特卡同学来北京,6年不见了,感觉没变,依旧阳光,下午到我厂臭美了一番。


晚上,ZYANG和小蔡过来一起吃了个饭,聊得比较尽兴,10点多了,店都关门了才散。


更多的不说了,回忆是挺好的






via WordPress http://www.econsh.com/2013/05/%e5%a5%bd%e5%8f%8b%e8%ae%b0-%e5%8c%97%e4%ba%ac%e5%b0%8f%e8%81%9a%e4%bc%9a/?utm_source=rss&utm_medium=rss&utm_campaign=%25e5%25a5%25bd%25e5%258f%258b%25e8%25ae%25b0-%25e5%258c%2597%25e4%25ba%25ac%25e5%25b0%258f%25e8%2581%259a%25e4%25bc%259a

Saturday, April 27, 2013

google定义广告的Active View

google 最近正在定义一个广告相关的概念,active view,目前是针对display广告的,含义我理解就是一个广告被看见的程度。


根据google 的介绍,和我的理解,做一些解释和预测。


为何有这个定义:


因为投放display广告的广告主最关心的问题是,我的这个广告知否被用户看见了,假如没看见这个impression的钱就打水漂了,假如看见了,直觉上来讲肯定是看的时间越长越好。


如何定义:


大致是基于广告在屏幕上展示的比例和展示的时间。比如,广告有80%以上在屏幕上而且展示时间大于2s可以认为是有效的view。active根据类似的方法把是否view定义成了数值,可以使用展示比例和展示时间两个度量,也可以整合成一个度量。


这个定义能干啥:


根据adwords博客的描述,在viewable的情况下(可以假设展示比例超过一定阈值),展示时间越长的广告的ctr越高。猜测active view未来将会有如下应用:


1. 根据active view将原有的impression一分为二,只有viewable的广告才计费(当然计费会提高),其余的不收费,即cpv


2. 将站点和广告的active view作为一个度量,作为广告展示的评分


3. 广告主可以根据active view的高低来分阶段付费,直觉上就是效果越好给钱越多,而效果好不好由activew view来定义


active view的扩展:


我觉得这个定义最大的意义就是让一个媒介的展示可以度量化,不论是搜索引擎对结果的评估,媒体网站对自己各个部分曝光度的评估都可以借鉴。






via WordPress http://www.econsh.com/2013/04/google%e5%ae%9a%e4%b9%89%e5%b9%bf%e5%91%8a%e7%9a%84active-view/?utm_source=rss&utm_medium=rss&utm_campaign=google%25e5%25ae%259a%25e4%25b9%2589%25e5%25b9%25bf%25e5%2591%258a%25e7%259a%2584active-view

Monday, April 15, 2013

微信公共账户-虫子侃球

假如你对足球感兴趣,那么你可以关注我的微信公共账户-虫子侃球,严格来说,它是个机器人,可以查询五大联赛球队最新比赛结果,以及预告未来几场比赛的时间。本文会先介绍一下这个账号的使用,然后也科普下这个账号的由来和开发。


添加关注


在微信公共账号里面搜索“虫子侃球”即可添加账号,或者扫描下面的二维码


微信公共账号-虫子侃球

微信公共账号-虫子侃球



主要功能点


1.输入球队名称,查询球队上一场比赛比分和未来比赛时间


虫子侃球-查询球队界面

虫子侃球-查询球队界面



2.查询联赛球队名单,一方面让用户了解联赛球队名单,另一方面为了让用户正确输入球队名称,同系统一致(后续会升级系统,引入球队名称的同义信息,更方便用户输入)


虫子侃球-查看联赛名单

虫子侃球-查看联赛名单



3.help界面,查看账号如何使用,错误输入也将显示该界面


虫子侃球-帮助信息

虫子侃球-帮助信息



公众账号的开发


唠叨几句关于这个公共账号的诞生。


为什么要做


1.最近使用了一些生活相关的公共账号,感觉和app和浏览器对比,得到我想要的东西都更加快捷,清晰,比如天气预报相关的,只需要输入城市名称,不像墨迹天气,要打开刷新一会,而且app还老是有一些通知,同时会常驻内存。


2.我是个足球迷,又是个喜欢折腾的手艺人,作为球迷我迫切想尽快知道我喜爱的球队的信息,同时也想知道对手的信息(想让他们输呗,额,好阴暗);作为一个手艺人,我对微信公共账号有点兴趣,想折腾折腾。


3.我有很多球迷朋友。


这三点促使我做了这个账号。


怎么做


这个比较简单,我这里简单说下,希望对新手上门公众账号有所帮助


1.首先是申请公众账号,这个需要身份证和手机号码,申请之后就可以配置和使用公众账号了。很多媒体人和公知的公共账号基本上会每天发布一篇文章(我觉得这个限制很好,一方面防止信息泛滥,另一方面可以促进提升质量)。而机器人账号需要使用高级功能。


2.微信高级功能,有编辑模式和开发者模式,编辑模式就是编辑key和value的映射,用户给你发送key,你返回它value,比较固定。而开发者模式则强大的多,可以让用户通过自己的server自定义返回信息。编辑模式和开发者模式不可共存(坑爹,简单的功能其实编辑模式修改更加方便)。


3.开发者模式,这个模式需要首先验证server的网址以便接入,参考微信的例子即可。然后就可以开发业务功能了(这个时候验证信息就可以不返回,而只是做验证了)。


4.虫子侃球的开发,使用php 语言(感谢我老婆对我的大力支持,我之前是个php 盲),目前功能比较单一,我选择了虎扑作为比赛信息的来源。用python处理了五大联赛的的球队名称和虎扑url的映射关系,然后直接放入php的脚本里面,这个只需要每年更新一次即可。接下来就是根据用户的输入返回相应的信息了,当用户输入球队名称命中球队dict,就去相应的虎扑url页面中截取对应的element即可,目前只选择了上一场比赛信息和未来几场比赛信息。


看上去比较简单吧,当然我做的也比较糙


账号的部署


开始把账号部署在了我这个blog所在的空间,由于在美国,响应时间成了问题。第二天改到了sae ,但是这货的开发者认证让我很蛋疼,而且天天要豆豆,一怒之下,不用了;最终选择了我厂的bae (百度应用引擎),用起来还不错,也顺便推荐一下。


账号的未来


一点就是把代码给share了,让大家帮我看看bug,另外看看大家都有什么建议,对账号进行改进。还有一点是找个人写点啥,推送给大家,我没那个文采,欢迎大家自荐






via WordPress http://www.econsh.com/2013/04/bugsoccer/?utm_source=rss&utm_medium=rss&utm_campaign=bugsoccer

Tuesday, April 2, 2013

blog 迁移至bluehost

之前一直都在用86的vps,先感谢一下。


迁移到bluehost有三个原因,首先是自己想独立放,不然经常!麻烦别人;二是vps目前我尚不需要,bluehost足以;三是bluehost空间和流量无限,可以折腾玩。


迁移起来并不复杂,将原来的blog的worspress目录备份上传到bluehost,原来的数据库导出。在bluehost需要建立数据库和用户,同时将这些name更新到wp-config.php,然后用phpMyadmin导入数据库。


有一点很重要,因为我不换域名,在新的空间work之前不能把旧的下掉,bliehost提供了临时的url,可以来做测试,而具体的使用可以参考bluehost的帮助,主要就是修改wp-option表对应的siteurl和home。然后就可以测试是否ok,这个时候有的页面和翻页可能有问题,但首页ok即可。


ok后,还有两件事要做,一是修改域名的nameserver,以便域名指向新的空间;二是在wordpress后台设置中将siteurl和home修改回来即可。


中间遇到图片中文乱码问题,手动更新了,后续还是用英文名吧。


迁移后,顺便把主题改了下,以前的感觉比较拥挤,换了个最新wordpress推荐的,还算小清新。


平板码字好痛:’(






via WordPress http://www.econsh.com/2013/04/blog-%e8%bf%81%e7%a7%bb%e8%87%b3bluehost/?utm_source=rss&utm_medium=rss&utm_campaign=blog-%25e8%25bf%2581%25e7%25a7%25bb%25e8%2587%25b3bluehost