这是一个非常专业的视频游戏优化案例(基本上是嵌入式系统)。我们过去常常将它们用于视频游戏中的就地加载数据行为,以加快加载速度(并避免碎片)。
基本上我们会在 PC Cooker 中创建控制台端(Playstation)对象。然后,为了减少碎片过载,我们将使用单个分配将数据对象打包在连续的缓冲区中。然后,对该缓冲区中的数据对象的引用将被更改,以从指向偏移量的指针中减去基数(unfix 调用 - 我们还有一个虚拟修复/ unfix 调用,它采用缓冲区基数并可以在偏移量和指针之间进行转换)。
当我们加载数据时,它加载到一大块中。根引用的所有数据都脱离了根对象。我们可以在根上执行就地“new”,这将为对象初始化正确的 VF 表并修复所有附加块(通过执行就地 new,然后分别修复附加块)。
我们需要调用构造函数(代替 new)来在对象中生成正确的 VF 表。但是,如果在构造函数期间指针被自动清除为 NULL,我们将丢失偏移量数据,并且无法在连续块内的对象之间重新创建指针。
FWIW,这是视频游戏世界中的常见技术。这伽玛经文章 http://www.gamasutra.com/view/feature/1461/fast_file_loading_pt_2.php(不是我或我的同事写的)详细解释了他们在另一家公司所做的类似事情:
另外,本次讨论的主题是.
甚至还举办过好几届GDC(游戏开发者大会 http://www.gdconf.com/)就该主题进行讨论。
在 Google 上搜索“load-in-place”会给出许多其他使用这种技术的例子,这些技术基本上需要未初始化的指针。
注意:目前,这是唯一真正回答所提出的问题(“C 或 C++ 中未初始化的指针是否有用途?”)的唯一响应,它给出了必须保持未初始化的指针的特定用途。
所有其他答案都是更好的答案引用的原始问题 https://stackoverflow.com/questions/1910832/c-why-arent-pointers-initialized-with-null-by-default(“[C++] 为什么默认情况下指针不初始化为 NULL?”)导致发布者提出这个问题。