我会问有用处。这是关于对编译的可执行文件/库大小的影响。与代码的可维护性或可读性无关。
从包中导入唯一使用的模块而不是导入主模块(它自己导入子模块)是否有用。
例如,对于Foreign模块(仅包含导入列表):
import Foreign.Storable
Run Code Online (Sandbox Code Playgroud)
代替:
import Foreign
Run Code Online (Sandbox Code Playgroud)
仅导入使用的函数/类型而不是导入整个模块有用吗?
例如:
import Foreign.ForeignPtr (ForeignPtr, mallocForeignPtr, withForeignPtr)
Run Code Online (Sandbox Code Playgroud)
代替:
import Foreign.ForeignPtr
Run Code Online (Sandbox Code Playgroud)
如果模块被编译为目标文件,那么就不会,甚至在理论上也不会。不能导入的函数仍然可以在内部使用,并且您可以加载模块GHCI并测试未导出的内部函数。
如果您\xe2\x80\x99静态链接或使用通用函数的特定实例,那么理论上编译器应该能够分析该特定程序无法访问库的哪些部分,并且作为整个程序优化,将将它们从可执行文件中删除。(例如,如果您的程序使用的唯一列表是 的列表Int,则编译器可能仅编译通用函数的部分专用[Int]版本,并且仅编译您使用的版本。)但是,它应该能够执行与无论您如何申报进口和出口,整个程序都会得到优化。
编译动态库时,理论上可以排除静态分析证明通过导出接口的任何可能调用永远无法直接或间接访问的代码路径或数据。如果是这样,编译器可以使用导出列表来证明库中的某些标识符完全无用,并将其从编译库中删除。
\n\n如果您\xe2\x80\x99询问某些特定编译器(例如GHC 8)的作用,我不\xe2\x80\x99不知道。你\xe2\x80\x99d必须测试一下才能看到。
\n\n特别列出导出和导入的主要好处是,多年后,当第二个模块声明您已经使用的标识符时,您\xe2\x80\x99将永远不会遇到麻烦。我以前也遇到过这种情况,现在我\xe2\x80\x99m 小心多了。
\n| 归档时间: |
|
| 查看次数: |
137 次 |
| 最近记录: |