免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4068 | 回复: 3

[C++] 有人用过#pragma interface 和#pragma implementation吗 [复制链接]

论坛徽章:
0
发表于 2013-09-01 20:02 |显示全部楼层
Normally, local copies of certain information (backup copies of inline member functions, debugging information, and the internal tables that implement virtual functions) must be kept in each object file that includes class definitions. You can use this pragma to avoid such duplication.

本来想用这个pragma减少C++ 程序运行时所需内存size的(目的是减少.text .rodata段的大小),但是用过之后,发现生成的程序.text段反而有所增大,不知道什么原因?有用过这两个pragma的人,请说说你们的经验?谢谢

(背景:
一款嵌入式设备(Linux 系统,C++/C开发),最近又出现了内存不足的问题,老大要求抽出时间对这个问题重点理一理,因为时间比较紧,不可能用代码重构的方法,想从代码优化方面入手来有效降低程序所需内存,目前只想到了一些比较简单的方法,如使用gcc检查不用的变量和代码,删除之;删除冗余的变量和函数,使用局部变量代替全局和静态变量;频繁使用的宏指令和inline 函数化;log函数合并和格式化字符串用宏代替...效果都不是特别明显,大家有什么好的方法?我们希望能把程序需要的内存降低10%左右(任务固定分配16M的Pysical内存),目前这些措施远未达到所需目标,不好向老大交差啊...)

论坛徽章:
17
处女座
日期:2013-08-27 09:59:352015亚冠之柏太阳神
日期:2015-07-30 10:16:402015亚冠之萨济拖拉机
日期:2015-07-29 18:58:182015年亚洲杯之巴勒斯坦
日期:2015-03-06 17:38:17摩羯座
日期:2014-12-11 21:31:34戌狗
日期:2014-07-20 20:57:32子鼠
日期:2014-05-15 16:25:21亥猪
日期:2014-02-11 17:32:05丑牛
日期:2014-01-20 15:45:51丑牛
日期:2013-10-22 11:12:56双子座
日期:2013-10-18 16:28:17白羊座
日期:2013-10-18 10:50:45
发表于 2013-09-01 21:38 |显示全部楼层
回复 1# hzy2hzy


    #progma interface和#progma implementation是两个功能相反的选项,虽然用pragma interface会有缩减文件大小的作用,但不建议使用,程序编译好之后用strip命令更方便?用过个命令可以极大的减小可执行文件的大小。另外过度的使用inline并不会减小文件的体积反而会加大,因为所有对inline函数的调用都转化为相应该函数的指令序列.

论坛徽章:
0
发表于 2013-09-02 19:38 |显示全部楼层
本帖最后由 hzy2hzy 于 2013-09-02 19:40 编辑

回复 2# myworkstation
有执行strip,今天有测试#pragma interface和#pragma implementation,仅仅使用#pragma interface生成的Object却有较大减少,但一般有
link错误,加上#pragma implementation后,生成的obj体积反而有所增大,一直没有想清楚是什么原因




   

论坛徽章:
17
处女座
日期:2013-08-27 09:59:352015亚冠之柏太阳神
日期:2015-07-30 10:16:402015亚冠之萨济拖拉机
日期:2015-07-29 18:58:182015年亚洲杯之巴勒斯坦
日期:2015-03-06 17:38:17摩羯座
日期:2014-12-11 21:31:34戌狗
日期:2014-07-20 20:57:32子鼠
日期:2014-05-15 16:25:21亥猪
日期:2014-02-11 17:32:05丑牛
日期:2014-01-20 15:45:51丑牛
日期:2013-10-22 11:12:56双子座
日期:2013-10-18 16:28:17白羊座
日期:2013-10-18 10:50:45
发表于 2013-09-03 10:11 |显示全部楼层
回复 3# hzy2hzy

这涉及到编译器和链接器的实现细节了。这两个选项影响的具体信息是“Vague Linkage”和"debuging information"相关的。引起链接问题是“Vague Linkage”,默认情况下使用COMDAT来处理对象的链接,如果使用了#pragma interface那么就使用weak ref的方式进行处理。“内联函数”,“vtable",“RTTI信息",“模板实例化”都属于“Vague Linkage”。COMDAT会把函数或变量包装成一个单独的节放在.o文件中,每个用到相同函数的translate unit在生成的o文件中都是有机同函数的节,最合成可执行文件的时候再把重复的节删除掉,#pragma interface将会禁用这个功能“Vague Linkage”(COMDAT),也不生成"debuging information"所以生成的文件变小了。#pragma implementation正好相反会生成所有信息所以文件变大了。



“Vague Linkage”
http://gcc.gnu.org/onlinedocs/gc ... .html#Vague-Linkage

   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP