大龙的博客
导航
C++博客
首页
新随笔
联系
聚合
管理
<
2009年1月
>
日
一
二
三
四
五
六
28
29
30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
5
6
7
留言簿
(43)
给我留言
查看公开留言
查看私人留言
收藏夹
ps
(rss)
随笔档案
2014年10月 (1)
2014年8月 (4)
2014年6月 (1)
2013年12月 (6)
2013年11月 (2)
2013年10月 (5)
2013年9月 (4)
2013年7月 (1)
2013年6月 (2)
2013年3月 (1)
2013年2月 (20)
2013年1月 (10)
2012年12月 (8)
2012年11月 (5)
2012年10月 (9)
2012年9月 (4)
2012年8月 (16)
2012年7月 (8)
2012年6月 (10)
2012年5月 (11)
2012年4月 (3)
2012年3月 (10)
2012年2月 (6)
2012年1月 (4)
2011年12月 (6)
2011年11月 (16)
2011年10月 (32)
2011年9月 (13)
2011年8月 (6)
2011年7月 (27)
2011年6月 (18)
2011年5月 (12)
2011年4月 (2)
2011年3月 (1)
2011年2月 (5)
2011年1月 (24)
2010年12月 (5)
2010年11月 (2)
2010年10月 (3)
2010年9月 (4)
2010年8月 (7)
2010年6月 (13)
2010年5月 (18)
2010年4月 (21)
2010年3月 (6)
2010年2月 (7)
2010年1月 (7)
2009年12月 (7)
2009年11月 (2)
2009年10月 (8)
2009年9月 (19)
2009年8月 (11)
2009年6月 (28)
2009年5月 (35)
2009年4月 (18)
2009年3月 (24)
2009年2月 (13)
2009年1月 (10)
2008年12月 (2)
2008年11月 (6)
2008年10月 (4)
2008年9月 (11)
2008年8月 (18)
2008年7月 (8)
2008年6月 (19)
2008年5月 (9)
2008年4月 (6)
2008年3月 (2)
2008年2月 (4)
2008年1月 (21)
2007年12月 (14)
2007年11月 (4)
2007年10月 (7)
2007年9月 (17)
2007年8月 (10)
2007年7月 (20)
2007年6月 (11)
2007年5月 (8)
2007年4月 (13)
2007年3月 (2)
2007年2月 (6)
2007年1月 (14)
2006年12月 (23)
2006年11月 (15)
2006年10月 (5)
2006年9月 (4)
文章档案
2007年11月 (1)
2006年12月 (1)
阅读排行榜
1. LinuxShell算术运算(49298)
2. Windows XP DDK 的有效下载地址(45079)
3. WinDBG教程(40915)
4. Android 打包签名 从生成keystore到完成签名 -- 转(40646)
5. 在Cygwin上安装编辑器vim (38977)
评论排行榜
1. Windows XP DDK 的有效下载地址(116)
2. 在Cygwin上安装编辑器vim (24)
3. (TCP-over-UDP library):基于UDP协议之上实现通用、可靠、高效的TCP协议 ---------- 转(14)
4. Compuware DriverStudio V3.2(10)
5. 经典好书 (10)
常用链接
我的随笔
我的评论
我参与的随笔
统计
随笔 - 864
文章 - 2
评论 - 378
引用 - 0
最新评论
1. re: 安装Nexus私服
谢谢博主。我刚学搭建nexus,挺不错的。
--做有为青年
2. re: 用slf4j+logback实现多功能日志解决方案 --- 转
谢谢楼主,整个流程非常清楚,照着做了一遍就会了。另外我分享一个logback目前尚存在的bug:当你发现INFO级和ERROR级的日志没有写成功时,上下移动一下配置文件中appender的位置就好了。
--welldone
3. re: LinuxShell算术运算
你这些都验证过吗
--是是是
4. re: 用slf4j+logback实现多功能日志解决方案 --- 转
写的非常好!
--Hello
5. re: (TCP-over-UDP library):基于UDP协议之上实现通用、可靠、高效的TCP协议 ---------- 转
评论内容较长,点击标题查看
--pcplayer
空数组char buffer[0](伸缩型数组成员)
#include
struct ast_var_t { struct ast_var_t *entries; char *value; char name[0]; }; int main() { struct ast_var_t test; printf("size is %d\n", sizeof(test)); return 0; } 执行此程序我们可以看到: size is 8 这是个广泛使用的常见技巧,常用来构成缓冲区。比起指针,用空数组有这样的优势: 1.不需要初始化,数组名直接就是所在的偏移 2.不占任何空间,指针需要占用int长度空间,空数组不占任何空间。 “这个数组不占用任何内存”,意味着这样的结构节省空间;“该数组的内存地址就和他后面的元素的地址相同”,意味着无需初始化,数组名就是后面元素的地址,直接就能当做指针使用。 它只用在结构体的的最后,也可以声明为char name[], 也就是不要0. 实际上它并不是希望您声明struct ast_var_t 类型的变量;而是希望您声明一个指向struct ast_var_t 类型的指针,然后使用malloc来分配足够的空间,以存放struct ast_var_t 结构的常规内容和伸缩型数组成员需要的任何额外空间 这样的写法最适合制作动态buffer。因为可以这样分配空间: malloc(sizeof(struct XXX)+ buff_len); 看出来好处没有?直接就把buffer的结构体和缓冲区一块分配了。用起来也非常方便,因为现在kongsuzu其实变成了buff_len长度的数组了。 下面看看这样做的用处 Typedef struct{ Char a[1]; Char b[]; }AA; AA *pf; pf = malloc(sizeof(AA) 5*sizeof(char));/*只分配一块内存*/ //////////////////////////////////////////////////////// 如果这样定义 Typedef struct{ Char a[1]; Char *b; }AA; AA *pf; pf = malloc(sizeof(AA)); pf->b = malloc(5*sizeof(char));/*看出来了么,这样需要分配两块内存,在释放时也要先释放b的内存,再释放pf的 内存*/ 这种想法源于C语言——试图说明一个可变长的struct。在你举的例子里,AA的大小,对编译器来说,为1字节。但是,你可以动态分配,例如200字节的一个块(类型为char[200]),再把这个块的指针,pf成类型为AA的指针。这样,在这个pf的变量中,字段b[]就可以视为一个长度为199个元素的char数组来使用了 这样的好处是: 一次分配解决问题,省了不少麻烦。大家知道为了防止内存泄漏,如果是分两次分配(结构体和缓冲区),那么要是第二次malloc失败了,必须回滚释放第一个分配的结构体。这样带来了编码麻烦。 其次,分配了第二个缓冲区以后,如果结构里面用的是指针,还要为这个指针赋值。同样,在free这个buffer的时候,用指针也要两次free。如果用空数组,所有问题一次解决。 其次,大家知道小内存的管理是非常困难的,如果用指针,这个buffer的struct部分就是小内存了,在系统内存在多了势必严重影响内存管理的性能。要是用空数组把struct和实际数据缓冲区一次分配大块问题,就没有这个问题。
posted on 2010-03-29 19:31
大龙
阅读(678)
评论(0)
编辑
收藏
引用
只有注册用户
登录
后才能发表评论。
【推荐】100%开源!大型工业跨平台软件C++源码提供,建模,组态!
网站导航:
博客园
IT新闻
BlogJava
知识库
博问
管理
Powered by:
C++博客
Copyright © 大龙