- 论坛徽章:
- 0
|
本帖最后由 keytounix 于 2011-11-20 09:11 编辑
回复 21# yulihua49
写了上面这个,我又想起另外一种方式,这个是我觉得最安全最可靠的
想的有点仓促,写出来可能会有很多错误,欢迎指正
typedef struct {
short no;
char *name;
char * class;
} xx_stu_t;
xx_stu_t stu_t{100,"li4","class 4"}
这个结构体改造
typedef struct {
int32 num_of_seg;//存放字段的总数
char * *seg_1;//不管他叫什么名称,反正我们在调用他时不需要,只需要偏移量
............
} J_stu_t __attribute__(pakged);
在a.c中
初始化LZ这个结构体如下
J_stu_t j_stu;
j_stu.num=3;
*j_stu.name<---"name:li4"
*j_stu.class<---"class:class 4"
......
注意这个
因为都是char **类型和
int32型
那么数据将是很对齐的东西
这意味着在这个结构体 存储的东西将是如下结构
&jst地址开始信息如下
&jst: 3
&jst+4: addr1
&jst+8: addr2
&jst+12: addr3
---------------
addr1: "no,100"
addr2: "name,li4"
addr3: "class,class 4"
这样岂不是很好?
在b.c中,我们不需要知道J_STU_t的具体内容
只需要知道一个事实就是
J_STU_t第一个4字节单元存放的是元素的个数
以后的都是指针
在struct_to_json()函数中
int struct_to_json(JSON * json,J_STU_t * jst)
{
int num;
memcpy(&num,jst,4)
//这个就获得了元素的数目
#define N 100
char buf[N]
#define get_seg(seg_index,buf) \
do{ \
memset(buf,0x00,N); \
memcpy(buf,*(jst + seg_index* 4),strlen(*(jst + seg_index* 4));\
}while(0);
}
for i<- [1,num]
get_seg(i,buf);
func(json,buf);
end for
}
如此不是很好吗?
这个 方法的优点很明显
就是不会出现因为编译器优化造成的偏移量 计算错误的问题
为什么?
因为都是以4字节递增的
int char ** 都是4字节
这个是非常安全的,
编译器优化或者不优化,都不会出现问题
另外缺点
可能体现在内存上
首先,结构体的开销可能不变
为什么?
虽然结构体中增加了一个int变量,
但是考虑到对齐问题,这个可能是一样的
当然上面给出的结构体 是不能体现这个结论的
其次,存储字段存放的额外开销
也就是每个字段 增加了 strlen(seg_name)+ 1个冒号这个开销
粗略估算 大概每一个字段增加9+1=10个字节左右
这些是需要考虑的 |
|