|
用户名:flashi 笔名:flashi 地区: 福建-厦门 行业:其他 |
| 日 | 一 | 二 | 三 | 四 | 五 | 六 |
在每个人的人生道路上,都有很多十字路口,也许你会犹豫,但是机会也在你犹豫时,不知不觉地溜走,所以现在我已选定方向,不再犹豫......
联系我:flybird14@163.com
unix自定义结构在优化编译中对齐问题
我最近碰见一个从端口读取数据流模块,并进行相应的流分析的问题。
是在Solaris平台下,用g++3.3.2编译,但是当我编译通过并测试时,
我的分析结果总是有错误。
对流模块的分析方法:我是先把该流模块存储到一个指定地址的自定
义结构体,然后依次输出结构体的各成员。
按理说这样简单的方式应该不会出错。结构体如下:
struct TIME1
{
WORD year;
BYTE month;
BYTE day;
BYTE hour;
BYTE minute;
BYTE second;
WORD data;
};
我用一段很简单的代码对结构体进行测试
#include <stdio.h>
typedef unsigned char BYTE;
typedef unsigned short WORD;
struct TIME1
{
WORD year;
BYTE month;
BYTE day;
BYTE hour;
BYTE minute;
BYTE second;
WORD data;
};
int main()
{
struct TIME1 t1;
printf("%d\n", sizeof(t1));
return 0;
}
结果输出为10,但是如果按照实际字节来算的话,struct TIME1的size应
该是2+1+1+1+1+1+2=9,为什么会凭空多出一个字节出来,通过google
查找资料发现,这是自定义结构体在优化编译中对齐问题导致的。
这也正是导致流分析出错的原因。
那么如何解决呢,通过查询资料,有以下简单的解决方法:
1.对于大多数的unix系统(不包括AIX)
可使用#pragma pack()压缩所使用的数据结构
#pragma pack(1)
struct TIME1
{
WORD year;
BYTE month;
BYTE day;
BYTE hour;
BYTE minute;
BYTE second;
WORD data;
};
#pragma pack()
在#pragma pack(1) 与 #pragma pack()之间的结构体,都将被压缩,其
所占空间的长度也就和实际情况一样了。
2.如果是SPARC/Solaris,还可以这样
struct XXX
{
}__attribute__ ((packed));
3.对于ibm的AIX系统,可采用如下方法解决该问题。
#pragma options align=packed
struct XXX
{
};
#pragma options align=reset
这是相对比较简捷的方法,当然还有其他办法,这里就不多介绍了。
在awk中使用变量
在shell脚本中,一个字符串变量
str="first second third forth fifth"
在一个循环中,要在第一次循环取到first, 第二次循环取到second,以此类推。。
脚本实现如下:
i=0
while true
do
i=`expr $i + 1`
substr=`echo $str|awk '{print $'$i'}'`
echo $substr
if [ $i -eq 5 ] ; then
break
fi
done
80年代出生者的苦水
仿佛看见了未来
你是人间的四月天
我说你是人间的四月天;
笑音点亮了四面风;轻灵
在春的光艳中交舞着变。
你是四月早天里的云烟,
黄昏吹着风的软,星子在
无意中闪,细雨点洒在花前。
那轻,那娉婷,你是,鲜妍
百花的冠冕你戴着,你是
天真、庄严,你是夜夜的月圆。
雪化后那片鹅黄,你像;新鲜
初放芽的绿,你是;柔嫩喜悦
水光浮动着你梦期待中白莲。
你是一树一树的花开,是燕
在梁间呢喃,——你是爱,是暖,
是希望,你是人间的四月天!
------------------
不经意间,看到这首林徽因的《你是人间的四月天》,莫名的,有一种淡淡的感动,
一个人,在一个陌生的城市,寂寞,孤独,郁闷,工作的劳累,一股脑儿地涌过来,
我的人间四月天在哪里?
买车票(joke)