c++ - 在 C 或 C++ 中是否使用未初始化的指针?

标签 c++ c pointers compatibility initialization

this question 的评论之一中,有人指出默认情况下初始化 C++ 指针会破坏与 C 的兼容性。

这很好,但为什么这样的事情很重要?我认为唯一真正重要的是我是否出于某种原因想要一个未初始化的指针。但我想不出我想要它的原因。

未初始化的指针有什么用吗?还是兼容性问题仅仅是一种兼容行为(即不增加开销)而不是破坏代码?

最佳答案

这是一个非常专业的视频游戏优化案例(基本上是一个嵌入式系统)。我们过去常常将它们用于视频游戏中的就地加载数据行为,以加快加载速度(并避免碎片化)。

基本上,我们会在 PC cooker 中创建控制台端 (Playstation) 对象。然后为了减少碎片过载,我们将使用单个分配将数据对象打包在一个连续的缓冲区中。然后将更改对该缓冲区中数据对象的引用,以从指向偏移量的指针中减去基数(unfix 调用——我们还有一个虚拟的 fix/unfix 调用,它采用缓冲区基数并可以在偏移量和指针之间进行转换)。

当我们加载数据时,它加载了一个大块。根引用的所有数据都在根对象之外。我们可以在根上做一个 inplace “new”,为对象初始化正确的 VF 表并修复所有附加 block (通过 inplace new 然后分别修复附加 block )。

我们需要调用构造函数(就地新建)以在对象中生成适当的 VF 表。但是,如果指针在构造函数期间被自动清除为 NULL,我们就会丢失偏移量数据,并且无法在连续 block 内的对象之间重新创建指针。


FWIW,这是视频游戏世界中的一种常见技术。这Gamasutra article (不是我或我的同事写的)详细解释了他们在另一家公司所做的类似事情:

另外,这个话题讨论在SourceForge .

甚至有几次 GDC ( Game Developer Conference) 讨论了这个主题。

在 Google 上搜索“就地加载”会给出许多其他人使用这种基本上需要未初始化指针的技术的例子。


注意:目前,这是唯一通过给出必须保持未初始化的指针的特定用途来实际回答问题(“C 或 C++ 中未初始化的指针是否有用?”)的唯一响应。

所有其他响应都是 original question referenced 的更好答案(“[C++] 为什么默认情况下不使用 NULL 初始化指针?”)导致发布者提出这个问题。

关于c++ - 在 C 或 C++ 中是否使用未初始化的指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1911117/

相关文章:

c++ - 在 C++ 中删除二维动态数组时出现问题(最终存储在 vector 中)

c++ - IntelliSense Visual Studio 2010 SP1 unique_ptr : unique_ptr<vector<unique_ptr<T>>> T

字符数组指针和整数转换(内存地址)

c++ - 在 CLion 上链接 Qt

c# - 内存泄漏检测器

c - 关于进程内存中的变量

c - 对链表中的元素进行排序

c - 为什么像 isdigit() 这样的函数会返回一个随机的非零值?

c - "de-referencing a NULL pointer"到底是什么意思?

c++ - 数组作为函数中的地址常量