事实:(类类型的)前向声明优于包含。
前向声明标题中的所有内容并包含该标题是否有缺点?(我猜编译时间不应该增加很多)
在大型代码库中,前向声明可能会占用大量屏幕空间,将它们替换为单个包含会很酷 - 但是,为每个标头设置前向声明标头没有意义前向声明。
有没有人这样做过或见过这个?
事实:(类类型的)前向声明优于包含。
前向声明标题中的所有内容并包含该标题是否有缺点?(我猜编译时间不应该增加很多)
在大型代码库中,前向声明可能会占用大量屏幕空间,将它们替换为单个包含会很酷 - 但是,为每个标头设置前向声明标头没有意义前向声明。
有没有人这样做过或见过这个?
我认为如果不走极端,前锋几乎没有任何不利因素。
我个人不会关心屏幕空间。它肯定胜过将构建时间乘以 2 到 5 到 10。我们过去的构建时间大约为 2 小时......一些额外的前向包含可能会消除同一个文件被点击数千次。
无论如何,您不能总是对所有内容都使用前向声明。如果您要对某些东西进行子类化,则必须具有类定义,这可能意味着包含。没关系。
您可以做的一件事是删除依赖项,即在头文件中取消内联您的代码。确保将接口向上推,将实现向下推(参见 Sutter 和 Alexandrescu 的 C++ 编码标准)。这意味着如果可能的话,您的公共 API 更喜欢抽象接口。如果你能做到这一点,那么你需要包含或转发声明的金额可以最小化。
哦,也不要将数百个函数和类放在一个头文件中,所以它有 8000 行长。没有人可以阅读/理解这些文件。
我通常在我的项目中这样做。但是我将前向声明拆分为modules
. 例如:gui
,core
等等。这在由于在头文件中使用包含而进行大量重新编译和手动编写前向声明之间取得了很好的平衡
使用前向声明而不是包含的主要好处之一是,您无需在更改头文件时重新编译尽可能多的源文件,因为该头文件只会包含在实际需要的地方。
您的方法可能会降低这种好处,在某些情况下甚至会变得更糟:每次在某处添加或删除类时,都需要更改包含前向声明的全局头文件。然后您将需要重新编译代码库中的每个源文件,包括那些不使用添加的类的文件。
尽管如此,由于可能不会经常添加类,所以这也许不是太糟糕的权衡。