blog | 逍遥郡


  • Home

  • Archives

  • Tags

  • Search

C/C++中的UB

Posted on 2007-05-21 |
一般而言的UB即未定义行为(Undefined Behavior),区别于未指定行为(Unspecified Behavior)。简单来说,前者是对bad-formed的程序而言,该程序的写法违反了C/C++标准;后者对well-formed的程序而言,该程序写法没有违反标准,只是标准提供了多种可选方案,但具体实现看编译器。具体可参见C99标准中关于程序behavior的定义。UB对程序来说可能出现任意行为,轻则出现意料之外的结果,重则程序崩溃,应该极力避免。 C/C++中常见的UB有: 整数溢出 序列点(Sequence Points) 违反了著名的Strict Aliasing规则 序列点 所谓序列点,C99定义如下: At certain specified points in the execution sequence called sequence points, all side effects of previous evaluations shall be complete and no side effects of subseque ...
Read more »

七种武器之mc

Posted on 2007-05-18 |
mc 全称是 GNU Midnight Commander,我认为它是自由操作系统下最强的文件管理器,无论是Linux还是FreeBSD均能稳定工作。神奇的是它只是纯字符界面的管理器,体积不过两三兆,却比nautilus, rox, thunar, konqueror 等等都要强大,并且不依赖X环境(不像krusader,且后者不够稳定),真是把ncurse用到了极限。不信么?Windows下的最强文件管理器totalcmd的操作方式跟它可是基本类似噢,虽然我不清楚它们之间的是否很有渊源,但mc提供甚至更加灵活的配置方式,下边先看一份双列显示的截图: 它默认用到了F1-F10键位,类似totalcmd的键位分别为F3(查看)、F4(编辑)、F5(复制)、F6(移动)、F7(新建目录)、F8(删除)和F1(帮助),另外的几个键位为F2(功能菜单,很强大)、F9(下拉工具栏菜单)和F10(退出)。遗憾的是,mc的键位不能重新自定义。 按F9后在Option(选项)菜单中可以自定义很多设置,比如采用双列还是双行显示,或者采用单列显示;文件排序方式等等。因为mc的功能实在太多,它的ma ...
Read more »

内存中的数据对齐问题

Posted on 2007-05-13 |
对CPU而言为了取值效率,一般需要你的数据的内存地址必须是对齐(align)的,这样可以加快程序的运行速度。虽然对齐会消耗的额外内存空间,但对于程序速度的提升来说,是值得的。 所谓对齐,就是每份数据的地址必须能整除2的n次方,这个2n就是对齐参数(alignment value),单位为Byte。对齐参数由编译器默认设置,当然你也可以自己指定。具体的对齐规则如下: 在结构体内部,第一个成员偏移地址为0,其它成员偏移地址必须是它 自身大小 和 对齐参数 两者中较小那个值的整数倍; 在计算结构体自身长度时,取 所用过的对齐值中最大值 的整数倍; 在结构体之间,各结构体的偏移地址必须是 各结构体中最大长度成员 和 对齐参数 两者中较小的那个值的整数倍。 对gcc来说,可以使用预编译指令 #pragma 或者gcc特有的关键字 __attribute__1 两种方式设置。 #pragma pack(n) 声明#pragma可以设置对齐参数的数值,缺省是8字节: #pragma pack( [show] | [push | pop] [, identifier], n ...
Read more »

用squashfs压缩ISO

Posted on 2007-04-10 |
texlive的ISO总是做得奇大,而且总是需要安装,真是浪费啊。于是就想把它定制一下,看看能不能做成一个免安装的ISO,直接mount就能使用了,那多好啊。在网上google一下,发觉还真有人已经做出来了,但是发觉还是有点大,我想做一个只包含UTF-8字符集的包就够了,于是研究了一下制作办法。 首先需要知道一个目录做ISO可以这样:mkisofs -U -R -D -o file.iso directory,但是这样做成的ISO没有经过压缩,传播时未免有些臃肿,就像texlive似的 :P。在Windows下边没有通用的压缩CD格式,但是在Linux下边可以使用squashfs这样高压缩比且快速的压缩CD格式,官方默认采用GZIP算法,也可以使用LZMA算法;具体的使用它提供一份HOWTO可以参考。 首先确保内核支持squashfs文件系统,然后利用工具mksquashfs来创建squashfs文件系统;为某个目录创建文件系统,绑定到一个文件(非一个设备),可执行如下命令: # mksquashfs /some/dir dir.sqsh # mkdir /mnt/dir # m ...
Read more »

惊心动魄3小时——修复系统

Posted on 2007-04-01 |
在实验室待到8点多,打算回去了,这时候师兄跑过来告诉我vista的盘刻好了;于是突发奇想,想装起来玩玩,没想到一下子搞到12点。 我笔记本上原来装了三个系统:Gentoo,Win2k3Serv,还有一个Mac OS X 10.4.3,因为Mac OS X for x86版本里边的驱动有些问题,笔记本显卡还是FireGL 9k,支持不是很好,常常Aqua挂掉。于是就想把这部分format掉,转个Vista玩。 不知道是因为Mac分区的问题还是Vista本身磁盘管理工具的问题,格式化再创建新分区之后,当安装到大半的时候,Vista安装程序告诉我,硬盘引导部分出现问题,所有的安装过程就被Cancel掉了(汗,这里不得不说安装程序做的有些傻,一是最后才去尝试引导系统,二是没有恢复性操作,前面又是复制又是解压又是检索硬件的忙活半天了,跑这里断掉了)。虽然有些纳闷,但是心里还是比较坦然,商业系统的安装碟自带的分区和格式化工具都是剧弱无比,没有一次能够在新分区下发挥成功的,当年装Mac的时候也是这样——那次的粗心导致硬盘数据全挂,寒。 重启机器,发觉出现“disk error, please ...
Read more »

C编程的一些注意事项

Posted on 2007-03-03 |
bit field 位字段以结构体形式声明,结构体为每个字段声明标签,并定义宽度。例如: struct BitFileds { unsigned int a :2; unsigned int b :4; unsigned int :2; unsigned int c :8; }; 其中,a、b、c分别占据2、4、8位,中间还有一个匿名字段,占2个位。按常规结构体定义该结构占据4个int大小,实际上它只占一个short大小。 需要注意的是整个struct的长度是“implementaion defined”,也就是说编译器决定。见标准 14882:2003,9.6 节第一款。 移位操作符 【注】移位之后补0,但有唯一例外:右移操作符对 int x=1«31 右移后补位1。 int x = 1<<31; // 1000 0000 0000 0000 0000 0000 0000 0000 x >> 1; // 1100 0000 0000 0000 0000 ...
Read more »

七种武器之awk

Posted on 2006-12-28 |
[TOC] awk是Bell实验室出品,它的作者Alfred Aho、Brian Kernighan和Peter Weinberger。同时,awk源自sed和grep,它同样也是一种模式匹配工具,每个指令均包含两个部分:模式和过程。模式一般是由斜杠(/)分隔的正则表达式,用于匹配当前行的字符串;过程是由大括号({})引起的awk语句和函数,用于指定一个或多个将被执行的动作。 命令格式 awk有两种语法形式:直接在终端inline脚本,或者调用一个awk脚本。 awk [options] 'script' var=value file(s) awk [options] -f scriptfile var=value file(s) 除了直接在脚本后设置自定义变量,也可以利用-v设置自定义变量,传入外部参数,可以定义多个变量,例如: awk -v t="test" 'BEGIN{print t}' 模式和过程 awk脚本由模式和过程组成,但也无需显示指定。如果没有模式,则过程应用到全部记录;如果没有过程,则输出匹配的全部记录。 模式可以是多种类型。 正则表达 ...
Read more »

bash备忘

Posted on 2006-12-16 |
[TOC] 符号 $# 传入脚本的参数个数(不包括argv[0]) $? 读取最后执行命令的退出码 $$ 运行脚本进程的PID $@ 所有的位置参数,每个参数由引号引用。 $* 所有的位置参数,和$@区别在于参数不被引号引用。 数组 BASH只支持一维数组,但参数个数没有限制。 声明一个数组: declare -a array 数组赋值,有多种方法: array=(var1 var2 var3 ... varN) array=([0]=var1 [1]=var2 [2]=var3 ... [n]=varN) array[0]=var1 arrya[1]=var2 ... array[n]=varN 计算数组元素个数:${#array[@]} 或者 ${#array[*]},BASH的特殊参数 @ 和 * 都表示 “扩展位置参数,从1开始”,在数组里可以通用。 提取数组里第n个元素(从0开始): ${array[n]} 提取数组里从下标n开始的m个元素: ${array[@]:n:m} 提取数组里第n个元素的长度: ${#arr ...
Read more »

非交互式流编辑器sed

Posted on 2006-11-16 |
[TOC] 替换 使用s全局替换foo为bar: sed 's/foo/bar/g' 也可以仅仅替换从第10到20行: sed '10,20s/foo/bar/' 替换语句可以并列多条: sed 's/foo1/bar1/;s/foo2/bar2/' 遇到需要转义定界符/的时候,可以使用其他字符替代: sed 's!/bin/bash!/bin/sh!' 注意sed中正则表达式使用到的特殊字符 .*{}[]^$\+?| 必须要转义。 如果要替换括号,需要使用 -e 参数: sed -e 's/(/X' 删除 使用d删除文件的第10到20行: sed '10,20d' file.txt 删除匹配到foo的行: sed '/foo/d' file.txt 插入 使用i将foo插入到文件开头: sed '1ifoo' file.txt 使用a将foo插入到文件末尾: sed '$afoo' file.txt 更改 使用c将第2行更改成foo: sed '2cfoo' file.txt 将匹配到foo的行,更改成bar: ...
Read more »

Perl学习手记

Posted on 2006-10-19 |
[TOC] Perl’s philosophy There is more than one way to do it. No unnecessary limits. 文件操作 open LOG,"< filename" 打开文件句柄 print FILE $out; 向文件句柄写 while(<LOG>) 使用文件句柄 select LOG 选择文件句柄 $| 用来清空文件句柄 <> diamond操作符,实现类UNIX工具方式。不需要使用open,默认逐行操作一 个文件。比如 while(<>){ print; } 就是 cat 的效果。 文件检测 -e $filename 返回布尔值,判断文件是否存在 -M FILEHANDLE 返回天数,该文件最后修改时间 -s $filename 返回文件大小,以Byte为单位 -A $filename 返回天数,该文件最后访问时间 … 见《Learning Perl》140页表 特殊符号 $_ 隐式标量…… ...
Read more »
1 … 14 15 16 … 19
Julian Qian

Julian Qian

记录编程、Hack和自娱自乐的一些玩意。

189 posts
60 tags
RSS
Creative Commons
© 2024 Julian Qian
Powered by Jekyll
Theme - NexT.Mist