C/C++中原子类型占用的空间大小

在C/C++中,基本数据类型占用的字节数(用sizeof(type)得到),在不同平台、不同编译器下可能是不同的,不像Java那样有统一的标准。长期以来我对这些具体数值并不是非常清楚,因此决定花些时间整理一下。测试使用的测试代码很简单: /* data_size.c */ #include <stdio.h> int main() { // NOTE: should use the format string “%u” when compiled with TurboC // NOTE: VC6 does not support “long long” printf(“sizeof(char): %zd, sizeof(short): %zd, sizeof(int): %zd\n”, sizeof(char), sizeof(short), sizeof(int)); printf(“sizeof(long): %zd, sizeof(long long): %zd, sizeof(void *): %zd\n”, sizeof(long), sizeof(long long), sizeof(void […]


扬帆起航

计划了好久,VPS也已经弄好有两三个月了,因为各种事情以及拖拉,一直没有真正着手把个人网站建立起来。 长久以来,一直觉得自己在基础上有很多不足的地方,比如数学基础不好,比如对计算机的原理还有很多模糊的地方,所以这近半年的时间里,不断地在学习巩固计算机基础。到六月底的时候,上阶段的学习总算基本告一段落了。前一个阶段看了很多很多书和资料,效果并不算理想,很多还是看过就忘了,不过,完整看完《深入理解计算机系统》以及基本完成课后习题,倒是一件值得高兴的事,一是因为从2009年就想看这本书,中间断断续续,没能坚持看下去,这次总算从头到尾看完了;二则是通过学习这本书的内容,着实让我对计算机的底层表示和实现有了深入的理解。 其实很早以前就发现自己从零开始设计实现一个系统的能力非常不足,只是之前一直觉得需要对基础的把握有了一定深度后,才开始去改善这方面的能力。回头想想,这两个其实都很重要,所谓谁先谁后,不过是我一厢情愿的自欺欺人。马上要找工作了,说真的,如果说现在心里有不踏实的话,那就是对自己这方面能力的不自信了。庆幸的是自己之前也没都白过,其他很多方面的能力都不算差,使用目前也不至于太没底。但无论怎么说,该来的始终要来,该吃的苦始终逃不掉,接下来,全力以赴提高快速实现的能力吧! 之前一直在犹豫,是要自己开发一个网站,还是使用开源的系统呢?今天终于想通了:在网站开发这个领域里,我一点都不算资深,相比之前在嵌入式平台上的受限的Web开发,现阶段的PC网站更为复杂(浏览器兼容性,不同设备的适配和兼容,功能的多样性和复杂性等),即便不考虑架构的合理性和灵活性,单单从工作量来看,都不是我一个人在短时间内能够完成的;当面对陌生事物时,如果不是深谙其中的原理,那么就应该懂得谦卑,认真去用现成的工具,用心去理解前人的理念和方法。 当明确了这些后,我想到了WordPress,于是马上去它的官网(org官网)下载安装包,安装、配置等一系列工作弄下来,也就两三个小时的时间!Hooray! 扬帆起航!路漫漫其修远兮,吾将上下而求索! P.S. 这几天GFW总算松口了,Google等服务终于时不时能用了!干IT的,活在大天朝真是不容易啊!且行且珍惜。。。


编译参数中-pthread以及-lpthread的区别

一般情况下,我们在链接一个(文件名为libxxx.so或libxxx.a等的)库时,会使用-lxxx的方式;在Linux中要用到多线程时,需要链接pthread库,按照惯例,我们应该使用-lpthread的方式来进行链接;但是,通过日常的观察,我发现很多开源代码都是使用了-pthread参数,而非使用-lpthread,这是为什么呢? 一通Google后,总算找到一些线索: 为了可移植性:在Linux中,pthread是作为一个单独的库存在的(libpthread.so),但是在其他Unix变种中却不一定,比如在FreeBSD中是没有单独的pthread库的,因此在FreeBSD中不能使用-lpthread来链接pthread,而使用-pthread则不会存在这个问题,因为FreeBSD的编译器能正确将-pthread展开为该系统下的依赖参数。同样道理,其他不同的变种也会有这样那样的区别,如果使用-lpthread,则可能在移植到其他Unix变种中时会出现问题,为了保持较高的可移植性,我们最好还是使用-pthread(尽管这种做法未被接纳成为C标准,但已基本是事实标准)。 添加额外的标志:在多数系统中,-pthread会被展开为“-D_REENTRANT -lpthread”,即是除了链接pthread库外,还先定义了宏_REENTRANT。定义这个宏的目的,是为了打开系统头文件中的各种多线程支持分支。比如,我们常常使用的错误码标志errno,如果没有定义_REENTRANT,则实现为一个全局变量;若是定义了_REENTRANT,则会实现为每线程独有,从而避免线程竞争错误。 参考资料: https://groups.google.com/forum/#!topic/comp.programming.threads/NCEpG0EOCCY http://www.lambdacs.com/cpt/FAQ.html#Q300 Author: Rex Shen Created: 2014-03-06 Thu 08:14 Emacs 24.3.1 (Org mode 8.2.5h) Validate


Emacs中编辑保存makefile文件时会错误地将TAB转成空格的解决方法

问题描述 我的Emacs使用了Purcell的配置,在其配置中使用了whitespace-cleanup,且通过在.emacs.d/lisp/init-edit-utils.el中设定: (require ‘whitespace-cleanup-mode) (global-whitespace-cleanup-mode t) 这样设定后,默认会全局使用whitespace-cleanup-mode,导致的结果是在保存文件前将TAB转换成对应的空格。这样的结果在多数情况下是我们想要的,但是对于有些类型的文件(比如makefile)而言便是灾难了。通过实测发现,只有当新建maekfile文件保存时,才会将TAB符替换成空格,导致makefile格式错误,而打开编辑一个已存在的makefile后保存则不存在这个问题。 解决方法   网上的方案 网上查了很多资料,基本都是以下解决方案: ;; 默认不加载indent-tabs-mode (setq-default indent-tabs-mode nil) ;; 保存文件前执行一次whitespace-cleanup (add-hook ‘before-save-hook ‘whitespace-cleanup) ;; 如果是打开makefile文件,则开启indent-tabs-mode,因为whitespace-cleanup中会用到这个 (add-hook ‘makefile-mode-hook ‘indent-tabs-mode) 但是我看了Purcell配置,发现两点跟以上解决方案不符: Purcell的配置并不是使用after-save-hook的,而是启用global-whitespace-cleanup-mode来实现空格处理的功能 当前版本的whitespace-cleanup-mode的实现代码中,并没用使用indent-tabs-mode,因此修改这个没用 我的解决方案 经过一系列的失败尝试后,我总算找到一种解决方案: ;; 后面设置tab-width部分只是个人喜好,与本问题无关 ;; 当打开makefile文件时,禁用whitespace-cleanup-mode。其他类似需要保留TAB的文件类型也可以采用这种方法 (add-hook ‘makefile-mode-hook (lambda () (whitespace-cleanup-mode 0) (setq tab-width 8))) 现在,我们在Emacs中新建makefile文件并保存后,再也不会出现问题了!^_^ Author: Rex Shen Created: 2014-03-05 […]


C++中public、protected以及private的使用

相比C语言,C++中通过class/struct来定义既包含数据,又包含行为的结构,从而支持了“对象”。现实世界中,一个人(一个对象)通常 拥有一些资产(数据),并且掌握某些技能(行为),并且这些资产和技能通常可以分为三类: 可以与任何人分享的 有限分享的,比如留给子孙后代的财产或本领 除了自己之外谁也不能用的,比如给自己留的棺材^_^ 为了表达类似的概念,在C++中使用public、protected以及private,分别代表可任意分享的、有限分享的以及独享的。比现实世界稍微复杂些,在C++中这三个关键字不仅可以修饰类成员,还可以修饰类的继承关系。 当这三个关键字用在类成员时: class Base { public: void publicMethod() { cout << “Begin of ” << __FUNCTION__ << endl; cout << “End of ” << __FUNCTION__ << endl; } static void staticPublicMethod(Base* obj) { // just call this class’s static private method staticPrivateMethod(obj); } int getProperty() […]


Emacs及扩展配置

Table of Contents 动机之反思 它山之石 扩展的管理 我额外安装的通用扩展(在purcell基础上) LaTex相关的问题和配置 org模式相关的问题、扩展及配置 (K)Ubuntu英文环境下Emacs配置中文输入法 其他遇到的问题及解决 总结 动机之反思 捣鼓了几天,总算把Emacs配置到基本正常使用的程度了。虽然有点迟,但还是尽量将能想起的细节都记录下来吧,否则以后要用到时都忘光了。 为什么会想转到Emacs上呢?多年以前,当我还在读大学时,就玩过Emacs,但是可能是觉得操作不方便,也可能是身边有朋友在用Vim了,捣鼓了一小段时间Emacs后,就转投向学习使用Vim了。 其实Vim作为编辑器而言非常好用,但是作为开发IDE而言,总是感觉欠缺;之前看过别人用Emacs,确实在代码调试上有其优势,可能就是因为这一点,一直耿耿于怀吧。 另外,在很早之前我就觉得在Emacs中显示中文很漂亮,比Vim中显示要漂亮些。恰好这次新买了MBP,换了OSX系统,就想在上面全新配置自己的环境。加上自己有一些任务管理、使用LaTex等的需求, 上网一搜,全都是将在Emacs上怎么实现的,于是就心痒痒想试试了。 本来想完全抛弃原先Vim的使用习惯,重新学习Emacs的各种操作的,但是每次用到Emacs那些复杂而且别扭的快捷键时,总是由心地希望用回Vim。我想,这就是Vim阵营的人鄙视Emacs的一大原因吧。 好在作为独缺好编辑器的操作系统,Emacs开发者已经为我这种两面派提供了终极解决方案:各种模仿Vi操作的扩展。最终,我使用了Evil,将ELPA中所有Evil开头的扩展都装了个遍,并将Emacs设 置为默认进入Evil模式,重启生效,顿时世界一片清静。其实我不太能理解为什么网上会有这么多Vim和Emacs之争,为什么不能站在相互取长补短的角度来使用它们?我觉得,只有真正去用一个工具, 才能真切体会它的好;同样,只有真正了解对手,才能发现自身的不足,也才有动力和方向去进一步完善它。当然,我只是一个纯粹的实用主义者,谁能解决我的问题,予我方便,我就用哪个,如果中 间遇到什么现在还没有的功能,而我有恰好有兴趣和时间去完善,那我才会去完善,回馈相应社区。 我不知道这次用Emacs会坚持多久,或者用了一段时间后发现不习惯了,还是用回Vim了。不过自从用了Evil,我感觉还是挺顺手了,现在环境也配置得七七八八了,应该够我用一阵的了。后续如果再 遇到问题,如果有时间,我想我还是会在Emacs上折腾的。 它山之石 刚开始我是从零开始配置Emacs的,所有的配置都写在~/.emacs中,基本也能工作,就是感觉自己要配置的东西太多,太繁琐。google了一番后,找到这篇文章:一年成为Emacs高手(像神一样使用编辑器), 里面的介绍蛮好的,作者力荐学Emacs要从使用研究大牛的配置开始,我刚刚开始学,不知道这样是否是最佳的学习方式,因此持谨慎的保留态度,但不可否认的是,大牛们的配置确实让我们省去了很多繁琐, 并且,给我们的后续配置提供了一个不同于原始Emacs配置方式的扩展框架(缺点是我们必须先搞清楚大牛的框架,否则出现问题时就不知道怎么办了)。老实说,相比Vim大牛们的配置,在网上能找到的 Emacs配置还是有点弱的,很多功能都没有,特别是编程方面的,基本就没有(purcell和prelude配置中对于C系的自动补全和自动缩进等都没有配置)。 从我google的结果来看,比较普遍使用的Emacs配置集基本有几个:purcell、prelude以及emacs-starter-kit。(注意,如果使用这些配置集,就不能添加自己的.emacs文件了,否则会导致这些配置集 失效;这些配置集内部都有机制可以让你定制自己的功能的) starter-kit:由于starter-kit的名字表明我太初级了,而我又自命不凡地觉得自己用了那么多年的Vim,不应该属于初级那类,因此我始终没有用starter-kit,也就无从知道它好不好用了。 purcell:purcell是《一年成为Emacs高手》中推荐的,作者Purcell本身是从事Web开发的,从评论上看更新有点快,所以自己配置的话,可能经常会出现配置冲突。这个配置中有个比较好的功能, 就是可以保存桌面,保存的桌面可以在下一次打开时自动载入。purcell的版本默认装不了el-get,因为跟装在里面的scratch扩展有冲突,我的解决方案是在git clone el-get的过程中在终端通过 sed命令将el-get中冲突的部分替换掉,或者启动Emacs后,先将scratch卸载(在ELPA中卸载),然后执行el-get的下载脚本,安装成功后再重启Emacs;由于启动时purcell配置会自动检测更新配 置环境,因此在启动过程中会检测到scratch被删除,然后重新下载安装scratch。在purcell中,如果要加入自己的定制,则可以通过在Emacs中执行“M-x customize-variable”或者在 ~/.emacs.d/lisp/中增加init-local.el文件,这个文件相当于.emacs文件,只是记得文件最后要有一句: (provide ‘init-local) prelude:在网上乱搜的时候无意看到这个的,后来发现其实很多人都有推荐这个,比推荐purcell的多。它设置了一个较好的功能,就是保存“el”文件时自动编译。如果要添加自己的东西,则可以同样 通过“M-x customize-variable”,或者:在~/.emacs.d/personal/中添加后缀为“el”的文件,这样prelude便会自动载入这些配置了,这点感觉比purcell的实现要灵活一些。我大概花了一天左右的 时间在prelude上安装扩展和配置,弄得七七八八,基本能正常写代码了。不过后来头脑一热,又改成使用purcell了。现在回过头来看,purcell和prelude相比,并没有太多的孰优孰劣,要改成自己习 惯得折腾一番,所以选择哪个完全是自己喜好了。 扩展的管理 目前Emacs主要有两种扩展管理器,一个是ELPA(package.el),另一个是el-get。其中ELPA是从Emacs24版本开始内置到Emacs中的,是官方的扩展管理器,但其仓库中的扩展比较少,需要配置其他仓库; […]


Linux下Thunderbird要安装的插件

  网络时代,总少不了跟邮件打交道,日常生活使用时多数是直接用网页版邮箱,在职场中一般要求用邮件客户端。使用Windows的朋友一般要么用Outlook,要么用Foxmail,其实,我们还有一个很不错的选择:Thunderbird。   Thunderbird是一个开源、跨平台的邮件客户端,由大名鼎鼎的Mozilla基金会维护,与Firefox是亲兄弟。众所周知,Firefox以其丰富且强大的扩展(Addon)著称,而Thunderbird和Firefox除了名份上的亲缘关系,更重要的是,这两款软件能共享许多扩展。   作为一个著名的开源邮件客户端,Thunderbird目前的功能已经非常完善了,但是难免有些功能还不完善,或者默认不预装。自从有了Addons,一切便有了可能。   由于我自己平常用到的功能也比较简单,所以在此仅简单介绍下我自己用的几个扩展: FireTray(Linux Only):可以在任务栏中显示Thunderbird邮箱状态(有多少未读邮件) Thunderbird Conversations:将邮件组织成类似于gmail的按照主题分组方式,以方便阅读和联系上下文 Lightning:在Thunderbird中集成日历功能 Provider for Google Calendar:提供将Google的日历数据导入到Lightning的功能 Google Task Sync:提供在Thunderbird(Lightning)上显示和管理Google帐号上的Task的功能  


(K)ubuntu上将分区格式化成NTFS格式

  新买了硬盘,装系统时,为Windows预留了几个分区,由于没有其他选择,因此将分区格式化成了fat32格式。装完系统后,总是很纠结,想把这些分区格式化成NTFS格式。   google了一下,从这个网址(http://www.ehow.com/how_7235886_format-ntfs-partition-linux.html)上找到了方法:   安装ntfsprogs(Kubuntu上没有这个包,但是其自带的ntfs-3g中已经包含这个工具了,所以不需要安装)   umount要格式化的分区(如:sudo umount /dev/sda1)   (可选步骤)sudo fdisk /dev/sda1,然后输入命令“t”(改变分区的系统id),选择分区号(如果不想变分区号,则输入原来的分区号即可,这里是sda1,所以输入1),然后输入十六进制的分区格式码,NTFS的话应该用87;还可以用b命令给分区添加盘符;之后输入命令“w”保存退出。   重启系统,以便使得修改生效。   调用mkntfs命令进行格式化(如:sudo mkntfs /dev/sda1)。整个格式化过程会几乎占满CPU(对我的Dell 1420n而言)   重启系统   是的,就是这么简单,哈!   注意:网上大部分帖子都建议在Windows下完成格式化操作,因为NTFS是私有格式,Linux下的工具并不能保证其能完美工作。