改用 Android 之后 II

在换到 Moto Defy 进入 Android 阵营之后,曾经写过一篇博客,对比 iOS 系统和 Android 系统。这篇博客被一些网站转载(1, 2)后,被各种“大神”们猛喷

现在 Defy 已经用了快半年,期间也接触过一些别的 Android 手机,最近实验室的项目更是进入了 Android 开发领域,是时候再写一篇,进一步写一写使用的感受。这次就不做对比了,因为手头没有运行 iOS 5 的苹果设备,而且也没有怎么用过新的 iOS。

先看一看之前那篇中写到的观点。

  • 同步

我始终还是认为,iOS 的同步是一个很好的方法,在音乐和视频传输、应用程序安装和数据备份方面都有明显的优势。

继续阅读“改用 Android 之后 II”

ZOIZ

2012 到了,那个啥,玛雅人预测要地球毁灭了?如果真的是这样的话,还有很多事情没有干呢。

2011 就是不断的南京-景德镇-南京来回的跑,实验室的项目真是相当的麻烦。暑假中间去趋势科技呆了一周,认识了不少大神,不知道明年是不是就从了趋势,不过也许外面的天空会更蓝一些。JSMinNpp 如预测的超过了 100,000 次下载,不过持续更新的也就 24% 左右。11 年还首次做了小规模的公开 PPT 演讲,其实开口说话也没有那么难。

技术的道路是走得比较顺利,不过感情方面持续不给力,好人卡有越拿越多的势头。眼看世界末日就要到了,为了人类的未来,还得继续加把劲。

Google stackoverflow in Firefox

自从发现了 stackoverflow.com 就无法自拔,csdn.net 之流完全无法何其匹敌。不过 stackoverflow 自己的搜索还是不太靠谱,于是每次都是用 Google 的 site 参数搜索 stackoverflow.com,用起来比较麻烦。于是做了个 Google Stackoverflow,可以在 Firefox 的搜索栏里面直接用 Google 搜索 stackoverflow。正在审核中,不过已经可以尝试安装了。

x=x++;

之前囧哥曾经写过一个日志,讨论一个问题,就是在c/c++里面这个代码的结果

x = 1;
x = x++;

执行后,x是2。这个结论还是比较显而易见的,不过编译器到底是怎么处理这段代码的呢?
我用 Fedora 15 自带的 gcc -S -O0 将 .c 编译成 .s 文件,来看看究竟编译器干了什么。

int x = 13; // 为了看汇编更方便,赋值13
x = x++;

被翻译成如下的汇编代码:

movl	$13, -4(%rbp)  ;x=13
addl	$1, -4(%rbp) ;x++
movl	$0, %eax
popq	%rbp

从汇编码来看,gcc 是这样理解x = x++的:

x = x; // 被优化掉了
x++;

也就是对于 int 这种 trivial 类型,= 的优先级高于后置++。 先赋值,再做后置++。
我们再来试几个代码:
第一组

int x=13;
int y;
y = x++;

翻译结果:

movl	$13, -4(%rbp) ;x=13
movl	-4(%rbp), %eax ;eax=x
movl	%eax, -8(%rbp) ;y=eax
addl	$1, -4(%rbp) ;x++
movl	$0, %eax
popq	%rbp

————————————————–
第二组

int x=13;
int y;
x = y = x++;

翻译结果:

movl	$13, -4(%rbp) ;x=13
movl	-4(%rbp), %eax ;eax=x
movl	%eax, -8(%rbp) ;y=eax
movl	-8(%rbp), %eax ;eax=y
movl	%eax, -4(%rbp) ;x=y
addl	$1, -4(%rbp) ;x++
movl	$0, %eax
popq	%rbp

————————————————–
第三组

int x=13;
int y;
y = ++x;

翻译结果:

movl	$13, -4(%rbp) ;x=13
addl	$1, -4(%rbp) ;++x
movl	-4(%rbp), %eax ;eax=x
movl	%eax, -8(%rbp) ;y=eax
movl	$0, %eax
popq	%rbp

————————————————–
从各个例子中可以看出,gcc 对于 int 这种 trivial 类型,认为 = 优先级高于后置++,低于前置++。

赋值先于后置++,后于前置++。

即使复杂点的例子x=((x++)+(y++)),相当于:

x=x+y;

x++;

y++;