高分求解全局变量的链接问题

yxlijinzhu 2009-08-03 11:30:27
C++程序中未被引用的全局变量也会被链接到dll或exe中,请问这是为什么?

#include "stdafx.h"

static int xxx[1024*512] = {0,1,2,3};

void testtestfunc()
{
}

int _tmain(int argc, _TCHAR* argv[])
{
//testtestfunc();
return 0;
}

上面这个简单的exe编译出来2Mb多,xxx数组和testtestfunc函数显然没有被引用到,testtestfunc函数被丢弃,但数组显然没有丢弃,编译器已经设了/REF 优化,

有哪位高人解释一下为什么数组不被丢弃?
有没有什么办法可以让编译器丢弃这个xxx数组?
...全文
117 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
brookmill 2009-08-04
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 lzy0001sl 的回复:]
看来机器靠不住,什么时候还是人比较可靠啊。
[/Quote]
机器确实不太靠得住,尤其是一些自以为是的机器。
我曾经听一个美国程序员说过这么一句话: The compiler thinks it is smarter than you, so ...
zhhy123 2009-08-04
  • 打赏
  • 举报
回复
vc6.0编译器:
debug版:2.57M
release版:2.03M

大多数编译器没有这种优化吧
老邓 2009-08-04
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 loaden 的回复:]
链接选项中加:/OPT:REF /OPT:ICF
[/Quote]
不好意思,又试了下,发现这个链接选项没用。改成这样就OK了!
const static int xxx[1024*512] = {0,1,2,3}; 

int main()
{
return 0;
}

VC10 编译出来的大小是29K(/MT)

另,如果使用MinGW 4.4.1去编译:
static int xxx[1024*512] = {0,1,2,3}; 

int main()
{
return 0;
}

大小只有4.5KB,而且编译器会报怨:
D:\ycdeng\project\asas\main.cpp|2|warning: 'xxx' defined but not used|
||=== Build finished: 0 errors, 1 warnings ===|
老邓 2009-08-04
  • 打赏
  • 举报
回复
链接选项中加:/OPT:REF /OPT:ICF
过去的我 2009-08-04
  • 打赏
  • 举报
回复
我猜,要在链接上做文章,改变ld 链接参数应该可以
副组长 2009-08-04
  • 打赏
  • 举报
回复

//static int xxx[1024*512] = {0,1,2,3};

这个样子她就丢弃了,我保证!
brookmill 2009-08-03
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 arong1234 的回复:]
兄弟,编译输出最小化在绝大多数情况都毫无意义,你省了1M多内存,除非你用在嵌入式设备上,有什么意义呢?
[/Quote]
这个我同意,我也觉得没啥实际意义。有时间研究优化,还不如自己改代码。
我就是觉得挺好玩,有点好奇。可能是闲得无聊吧。
lzy0001sl 2009-08-03
  • 打赏
  • 举报
回复
看来机器靠不住,什么时候还是人比较可靠啊。
brookmill 2009-08-03
  • 打赏
  • 举报
回复
又试了试VS2005的命令行编译cl.exe
有关优化的选项:
/O1 minimize space /O2 maximize speed
/Ob<n> inline expansion (default n=0) /Od disable optimizations (default)
/Og enable global optimization /Oi[-] enable intrinsic functions
/Os favor code space /Ot favor code speed
/Ox maximum optimizations /Oy[-] enable frame pointer omission

我试了 /O1 /O2 /Og /Ox
结果都是2M
arong1234 2009-08-03
  • 打赏
  • 举报
回复
而且“对”比“优”永远有极高的优先级,如果你靠优化来保证正确性,你的程序永远不可靠
arong1234 2009-08-03
  • 打赏
  • 举报
回复
兄弟,编译输出最小化在绝大多数情况都毫无意义,你省了1M多内存,除非你用在嵌入式设备上,有什么意义呢?

[Quote=引用 5 楼 brookmill 的回复:]
我用gcc试了一下:
用gcc -O0 (不优化)编译出来2M
用gcc -O2 (优化)编译出来6K
[/Quote]
brookmill 2009-08-03
  • 打赏
  • 举报
回复
我用gcc试了一下:
用gcc -O0 (不优化)编译出来2M
用gcc -O2 (优化)编译出来6K
pmerOFc 2009-08-03
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 arong1234 的回复:]
依赖优化确保逻辑正确的方法应该尽量抛弃
[/Quote]
我觉得不仅仅是尽量
arong1234 2009-08-03
  • 打赏
  • 举报
回复
依赖优化确保逻辑正确的方法应该尽量抛弃,你这种情况没有必要自找麻烦
[Quote=引用楼主 yxlijinzhu 的回复:]
C++程序中未被引用的全局变量也会被链接到dll或exe中,请问这是为什么?

#include "stdafx.h"

static int xxx[1024*512] = {0,1,2,3};

void testtestfunc()
{
}

int _tmain(int argc, _TCHAR* argv[])
{
//testtestfunc();
return 0;
}

上面这个简单的exe编译出来2Mb多,xxx数组和testtestfunc函数显然没有被引用到,testtestfunc函数被丢弃,但数组显然没有丢弃,编译器已经设了/REF 优化,

有哪位高人解释一下为什么数组不被丢弃?
有没有什么办法可以让编译器丢弃这个xxx数组?

[/Quote]
pmerOFc 2009-08-03
  • 打赏
  • 举报
回复
看来编译器的看法和我一致
pmerOFc 2009-08-03
  • 打赏
  • 举报
回复
不理解
xxx数组没用为什么要写?

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧