未使用的容器的负面影响是什么?
我知道它们会导致二进制文件大小增加(或者是?),还有其他吗?
Answers:
它们不一定增加二进制文件的大小,但会增加编译时间。
一般来说,是的,确实会引起一些问题。从逻辑上讲,如果您不需要它,则不要包含它。
在标头中声明为外部并在源文件中定义的任何单例将包含在您的程序中。这显然会增加内存使用量,并可能导致更频繁地访问其页面文件,从而可能导致性能开销(现在已经不是什么大问题,因为单例的大小通常为中小型,因为我认识的大多数人都有6+ GB RAM)。
编译时间会增加,并且对于经常编译的大型商业项目而言,这可能会导致资金损失。它可能只增加总时间几秒钟,但是将其乘以数百次编译,则可能需要测试和调试,并且浪费了大量时间,因此转换为利润损失。
标头越多,与您在程序或其他标头中定义的宏发生预料之外的冲突的可能性就越大。可以通过正确使用名称空间来避免这种情况,但这仍然很麻烦。再次,损失了利润。
导致代码膨胀(文件更长,因此读取更多),并且可以在很大程度上增加您在IDE的自动完成工具中找到的结果的数量(有些人虔诚反对这些工具,但是它们确实在一定程度上提高了生产率)。
您可能不知不觉地将其他外部库链接到程序中。
这样做可能会无意间导致世界末日。
我假设标头都可以被认为是“真诚的”,也就是说,它们不是为了破坏您的代码而精确编写的。
通常会减慢编译速度(预编译的标头会减轻这一点)
这意味着没有真正存在的依赖项(这是语义错误,而不是实际错误)
宏会污染您的代码(通过在BOOST_FOREACH而不是FOREACH中使用带有类似名称空间的名称的宏前缀来缓解)
标头可能暗示指向另一个库的链接。在某些情况下,未使用的标头可能会要求链接程序将您的代码与外部库链接(请参阅MSCV的#pragma comment(lib,“”))。我相信,如果不使用一个好的链接程序,它将不会保留该库的引用(IIRC,MSVC的链接程序将不会保留未使用的库的引用)。
删除标头可以减少意外错误。如果您不信任标头(某些编码器要好于其他编码器...),则删除标头可以消除风险(您不希望包含标头来更改所有内容的结构对齐方式:生成的错误是.. 。照亮...)。
标头的static变量声明将污染您的代码。每个静态变量声明将导致在已编译源中声明一个全局变量。
C符号名称会污染您的代码。标头中的声明将污染您的全局或结构名称空间(并且很可能会同时污染这两者,因为结构通常是类型定义的,以将其类型引入全局名称空间)。库为它们的符号加上某种“名称空间名称”(例如SDL_CreateMutexSDL)可以减轻这种情况。
非命名空间的C ++符号名称会污染您的代码。由于上述相同原因。对于错误使用该using namespace语句的标头也是如此。现在,正确的C ++代码将为其符号命名空间。是的,这意味着您通常不应该信任在全局命名空间中声明其符号的C ++头...
include表示您要添加更多声明。因此,在编写自己的全局函数时,需要谨慎考虑该函数已包含在标头中。
例如 如果您编写自己的类auto_ptr {}而不包含“内存”,它将很好地工作。但是只要您包含内存,编译器就会给出错误,因为它已经在内存头文件中声明了
<memory>它将声明一个std :: auto_ptr。这是C ++中名称空间的重点。一个纯C的例子将是一个更好的例子……
you are redefining class auto_ptr so it will give error:你不明白。<memory>的auto_ptr受名称空间保护std,因此您可以auto_ptr在全局名称空间中编写自己的类,甚至可以在自己的名称空间中编写更好的类,并且不会与之冲突,std::auto_ptr因为您受到C ++名称空间的保护,这使两个类完全不同。因此,没有编译错误。
是的,由于外部未使用的变量,它们可以增加二进制大小。
//---- in unused includes ----
extern int /* or a big class */ unused_var;
//---- in third party library ----
int unused_var = 13;