编译器只会编译可以执行的代码吗?

问题描述 投票:0回答:6

我有一个类库,但只使用了其中的一部分。是否需要删除未使用的内容以缩小创建的代码的大小(在发布配置中)?

据我所知,编译器会处理这个问题,并且删除代码不会改变 EXE 文件的大小。这永远都是真的吗?删除所有不需要的代码将花费很长时间,所以我想知道是否需要这样做。

更多信息:类库中的某些方法和类不是从执行代码中调用的,而是由类库中代码的其他部分引用的(它们本身从未被调用)。

c# visual-studio-2010
6个回答
41
投票

不,编译器也包含“死”代码。 一个简单的原因是,并不总是能够准确地知道哪些代码将被执行,哪些代码不会被执行。 例如,即使是从未引用的私有方法也可以通过反射调用,而公共方法可以由外部程序集引用。

您可以使用工具来帮助您查找并删除未使用的方法(包括仅由其他未使用的方法调用的方法)。 尝试使用哪些工具和技术来查找死代码?查找未使用的代码来帮助您入门。


6
投票

一切都被编译了。不管是否被调用。该代码可以由外部库调用。

使编译器忽略代码的唯一方法是使用编译器预处理器指令。有关这些的更多信息这里


0
投票

我怀疑编译器会删除任何东西。事实是,编译器无法区分使用了什么和没有使用什么,因为借助反射,可以实例化类型并通过名称调用方法。


0
投票

假设有一个名为

Utility
的类库。您创建了一个新项目并将此类库添加到该项目中。即使您的 EXE 仅调用类库中的 1-2 个方法,删除未引用的代码也绝不是一个好主意。

这违背了可重用的原则。尽管库中存在一些未被 EXE 引用的类,但它不会对程序的性能或大小产生任何不良影响。


0
投票

在大多数语言中,确定所有且唯一的死代码(如果人们理想化地认为拥有一个像语言一样的“数学世界”)是递归不可判定的。 (像布莱斯语言这样的一些罕见语言是可判定的。)


0
投票

对于是否存在“需要删除未使用的内容以缩小创建的代码的大小”的问题:我认为这只会对节省网络带宽有用。在 Web 应用程序中删除未使用的代码对于提高加载速度等至关重要。

如果您的代码是 exe 或库,我认为删除死代码的唯一原因是提高代码质量。这样,两年后查看您的代码的人就不会摸不着头脑想知道它的作用。

© www.soinside.com 2019 - 2024. All rights reserved.