为什么游戏引擎比动态链接库更喜欢静态库

num*_*l25 19 c c++ visual-studio-2008 visual-c++

我一直在读几本游戏书.他们总是喜欢通过动态链接创建引擎作为静态库.我是c ++的新手,所以当谈到静态库和动态链接库时,我并不是很了解.我所知道的是静态库增加了程序的大小,在你的程序中需要加载DLL链接库.

[编辑]

我玩游戏几乎看起来他们使用DLL来加载声音,灯光,而不是单独加载.当水平加载.因为你在游戏菜单中不一定需要它.

Dou*_*rie 20

动态链接库需要与位置无关; 这可能会导致某些处理器体系结构的性能低效.

当包含在程序中时,可以优化静态库,例如,通过剥离死代码.这可以提高缓存性能.

  • 静态库在编译/链接时与您的可执行文件链接; 链接器知道静态库代码的加载地址,并可以对其进行优化.链接器还知道库中的哪些函数被引用,并且可以去除未引用的函数.动态库在运行时链接,并且可以由多个进程共享,因此地址不是先验地知道的,也不能移动库.动态库具有可以动态使用的入口点(duh);-),因此不能从内存占用中消除代码. (6认同)
  • "位置无关"我的意思是代码必须能够运行,无论它在内存中加载的位置.这意味着使用相对跳转和基于指针的数据引用(或PC相对const数据引用).非常智能的装载机可以在加载时进行一些工作以最小化影响.但是,可以编译和链接静态代码以使用已知的数据和代码地址. (2认同)
  • @BlueRaja如果所有使用它的进程都保证在同一地址看到DLL,则预链接它不需要反汇编.旧的a.out格式做到了这一点,但这不实用(DLL的全球集中管理权限).我认为Mac OS X也可能有这样的东西(但只在计算机规模上集中化) (2认同)

fox*_*ods 7

通过位置独立,他意味着由于游戏引擎和DLL完全分离,DLL是独立的,不能交织到游戏引擎代码中,而静态链接库允许编译器使用你的游戏引擎代码和优化图书馆代码.

例如,假设有一个小函数,编译器认为应该内联(直接复制代替函数调用).然后使用静态库,编译器将能够内联此代码,因为它知道代码是什么(您在编译时链接).但是,对于动态库,编译器将无法内联该代码,因为它不知道代码是什么(因为它将在运行时链接).

  • Visual Studio具有完整的程序优化功能,可以很好地内联文件,也可能跨库.如果gcc没有类似的东西我会感到惊讶(尽管大多数游戏都不会用gcc编译). (2认同)