在Objective-C中包含头文件的成本

在Objective-C中包含头文件的成本,objective-c,import,header,dependencies,header-files,Objective C,Import,Header,Dependencies,Header Files,这似乎是一个非常愚蠢的问题,但在Objective-C中包含(实际上,调用#import)头文件的成本是多少?我厌倦了在不同的位置不断地包含相同的标题,所以我决定创建一个包含几个常用标题的GlobalReferences.h文件 如果没有使用其他文件,那么包含对这些文件的引用是否会产生可观的成本?我的直觉告诉我“不”,因为在使用#import时,链接器似乎只知道其他文件,但我不确定iPhone开发是否需要特别考虑,这正是我的项目所关心的。有什么想法吗?链接器对导入文件一无所知。事实上,Objec

这似乎是一个非常愚蠢的问题,但在Objective-C中包含(实际上,调用
#import
)头文件的成本是多少?我厌倦了在不同的位置不断地包含相同的标题,所以我决定创建一个包含几个常用标题的
GlobalReferences.h
文件


如果没有使用其他文件,那么包含对这些文件的引用是否会产生可观的成本?我的直觉告诉我“不”,因为在使用
#import
时,链接器似乎只知道其他文件,但我不确定iPhone开发是否需要特别考虑,这正是我的项目所关心的。有什么想法吗?

链接器对导入文件一无所知。事实上,Objective-C编译器也对它们一无所知,它们由预处理器进行预处理。预处理器将头的内容有效地插入到源文件中包含它们的点中。实际的Objective-C编译器将不得不处理额外的函数原型和类接口定义,即使它们没有被使用。虽然这通常不是一项冗长的任务,但它会增加编译时间。应用程序的最终大小和性能应保持不变

要查看原始源代码的外观(包括所有头文件和扩展宏等),请执行以下操作:


最大的缺点是编译时间。如果在每个源文件中都导入了所有头文件,则每次更改头文件时都必须重新生成整个项目。

导入/包含超出需要的头文件将增加编译时间。你可以通过以下方法减轻一些痛苦。

我的印象是,这不会太成功:
去做吧。除非您包含的头是大量的,并且您没有使用预编译头,否则您不会看到任何差异。正如其他人所说,
#import
是一个预处理器指令。这没有运行时后果,在许多情况下也没有显著的编译时后果

在Objective-C中包含(实际上,调用#import)头文件的成本是多少

编译器可能会在不必要的情况下读取这些文件。导入
#import
ed后,需要对附加文件进行解析、编译等。对于每个翻译(例如
.m
文件),它在中可见--使构建和链接时间更长。10倍的时间并不令人惊讶

我厌倦了在不同的位置不断地包含相同的头,所以我决定简单地创建一个GlobalReferences.h文件,其中包含几个常用的引用头

通常,这是一个非常糟糕的方法。常见的问题是,每当GlobalReferences.h包含的任何文件发生更改时,您的整个项目以及所有中间依赖项都需要重建、重新链接等

我的偏好是将程序分成相互依赖的小库或包(例如,StoreKit.framework是一个小包/库)——但将这些库/框架/包塞进头中解决不了任何问题。此外,转发声明并将数据存储在类continuation或
@implementation
中可以显著减少依赖性(因为您可以将库/头的包含本地化为只包含必要的翻译)

最后,在lazy includes之后进行清理是非常耗时的,尤其是当有很多项目并且您一直等到项目的构建时间慢得令人无法忍受时。基本上,您必须返回并分离不必要的依赖项、重建、重复(几天)

如果没有使用其他文件,那么包含对这些文件的引用是否会产生可观的成本


当然。你的项目越大,懒惰的包容性就越差。大型项目中的一些惰性包含可能会向大多数已编译文件中添加数十行或数十万行,并可能触发对许多源代码的频繁重新编译。这给构建过程增加了大量的复杂性——CPU需求增加,RAM使用增加,磁盘IO增加……而且,随着代码库/项目复杂性的增加,这再次成为一个更大的问题。

谢谢大家对这个问题的澄清。
gcc -E your-source-file.m