免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3778 | 回复: 11
打印 上一主题 下一主题

[C++] 如何节省printf公共子串的空间 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-08-29 20:48 来自手机 |只看该作者 |倒序浏览
某函数内有许多printf函数,每个printf函数格式化字符串的前部分是相同的子串,如:
printf "[filename:%d enter %s ] a=%d",__line__,__func__,a
printf "[filename:%d enter %s] b=%d",__line__,__func__,d
格式化字符串右中括号之前是相同的,但后半部分不同,编译器把格式化字符串视为一个整体,认为前后两个格式化字符串是不同的,因此内存中占用静态常量数据区的两块内存,有什么方法可以把格式化字符串中相同的子串提取出来,让相同的子串只在内存中占用一份,从而节省程序需要的内存空间?谢谢

论坛徽章:
36
子鼠
日期:2013-08-28 22:23:29黄金圣斗士
日期:2015-12-01 11:37:51程序设计版块每日发帖之星
日期:2015-12-14 06:20:00CU十四周年纪念徽章
日期:2015-12-22 16:50:40IT运维版块每日发帖之星
日期:2016-01-25 06:20:0015-16赛季CBA联赛之深圳
日期:2016-01-27 10:31:172016猴年福章徽章
日期:2016-02-18 15:30:3415-16赛季CBA联赛之福建
日期:2016-04-07 11:25:2215-16赛季CBA联赛之青岛
日期:2016-04-29 18:02:5915-16赛季CBA联赛之北控
日期:2016-06-20 17:38:50技术图书徽章
日期:2016-07-19 13:54:03程序设计版块每日发帖之星
日期:2016-08-21 06:20:00
2 [报告]
发表于 2013-08-29 21:10 |只看该作者
用宏啊         

论坛徽章:
0
3 [报告]
发表于 2013-08-29 23:35 |只看该作者
用宏在预处理时进行替换后编译,还是分成两个常量字符串保存。

下面这样做呢?保留了常量字符串"[filename:%d enter %s ] %s=%d" 和 “a", "b",个数增加了,但是存储的少。
printf "[filename:%d enter %s ] %s=%d",__line__,__func__, #a, a
printf "[filename:%d enter %s ] %s=%d",__line__,__func__, #b, b

论坛徽章:
0
4 [报告]
发表于 2013-08-30 08:14 |只看该作者
宏可以,用函数也行。

论坛徽章:
0
5 [报告]
发表于 2013-08-30 20:57 |只看该作者
本帖最后由 hzy2hzy 于 2013-08-30 20:57 编辑
wbchn 发表于 2013-08-29 23:35
用宏在预处理时进行替换后编译,还是分成两个常量字符串保存。

下面这样做呢?保留了常量字符串"[filen ...


该方法不错!只是实际代码trace函数格式化字串后面部分因打印的实参不同而变化很大,需要定义很多Trace宏去适配了。

谢谢!

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
6 [报告]
发表于 2013-08-31 10:34 |只看该作者
这肯定是用宏的, 需要使用宏的不定参数

论坛徽章:
0
7 [报告]
发表于 2013-09-01 19:15 |只看该作者
linux_c_py_php 发表于 2013-08-31 10:34
这肯定是用宏的, 需要使用宏的不定参数


不定参数的宏用的比较少,不是很熟悉 ,能给写一个实例吗 ?谢谢

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
8 [报告]
发表于 2013-09-01 19:51 |只看该作者
const char *ponecopy ="[filename:%d enter %s ] a=%d";

printf ponecopy,a,b,c
printf ponecopy,d,e,f

论坛徽章:
0
9 [报告]
发表于 2013-09-01 20:05 |只看该作者
folklore 发表于 2013-09-01 19:51
const char *ponecopy ="[filename:%d enter %s ] a=%d";

printf ponecopy,a,b,c


这样第二个printf打印出来的变量名也是a了,是不能满足要求的!

论坛徽章:
3
寅虎
日期:2013-11-27 07:53:29申猴
日期:2014-09-12 09:24:152015年迎新春徽章
日期:2015-03-04 09:48:31
10 [报告]
发表于 2013-09-01 20:38 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP