我看了很多文章,大部分都告诉我们同样的故事:除非必要,否则不要使用指针。作为一个来自C#/Java背景下熟悉内存管理的人,我完全不知道在什么情况下使用指针是适当的,除了以下这些情况:
- 动态内存(例如变量大小数组)
- 多态
在游戏开发的情况下,还有哪些情况下我会使用指针?
我看了很多文章,大部分都告诉我们同样的故事:除非必要,否则不要使用指针。作为一个来自C#/Java背景下熟悉内存管理的人,我完全不知道在什么情况下使用指针是适当的,除了以下这些情况:
在游戏开发的情况下,还有哪些情况下我会使用指针?
“不要使用指针,它们很慢”在C++中没有意义。
这就像说,“不要使用变量,它们很慢”。
你是想说,“不要使用动态内存分配”吗?
如果是这样的话:我认为你现在不用担心它。先编写代码,然后再进行优化。
还是你想说,“不要使用裸指针(即类型为foo*
的指针)”,这需要使用new
和delete
?
如果是这样的话,那是一个好建议:通常你需要智能指针来管理对象,而不是处理裸指针。在大多数C++代码中,您不应该需要使用new
和delete
,尽管这可能看起来很自然。
但它们在幕后仍然是指针!
还是你有其他意思?
感谢下面的@bames53指出这一点:
如果传递副本是一个选项(即当您传递小量的数据时,而不是一个大于几个寄存器的巨大结构或数组,例如在~16字节左右),请勿使用指针(或引用)来传递数据;改为通过复制传递。这样可以让编译器更好地进行优化。
这个想法是你不希望出现内存泄漏,也不希望在检索内存时程序变慢,因此,如果预先分配所需的结构体,那么你可以使用指针来传递结构体,因为这样比复制结构体更快。
我认为你只是对为什么指针可能被认为是不好的感到困惑,因为有很多地方可以使用它们,你只需要考虑为什么要这样做。
指针的一个主要用途(虽然在可能的情况下,引用通常更好)是能够在不复制对象的情况下传递对象。如果一个对象包含大量数据,复制它可能会非常昂贵和不必要。在游戏开发方面,您可以将指针存储在像std::vector
这样的容器中,以便您可以管理游戏中的对象。例如,您可以有一个向量,其中包含对游戏中所有敌人的指针,以便您可以对它们执行某些“大规模程序”。也许值得研究一下智能指针,因为这些可以使您的生活变得更加轻松(当涉及到防止内存泄漏时,它们非常有帮助)。
对于可变大小的数组,您不需要使用指针,通常应该使用std::vector
。对于多态性,您也不需要使用原始指针;虚函数可以与智能指针(如unique_ptr
)一起使用。
在现代C++中,您很少需要使用指针。通常它们会隐藏在资源拥有类(如向量)中。为了在不复制对象的情况下传递对象,您可以使用引用。大多数剩余的指针用途都由智能指针覆盖。非常少见的情况下,您可能需要一个“非所有权”指针,在这种情况下,原始指针是可以的。
如果您学习替代指针的内容,就会了解指针的适当用法。因此,请学习RAII、引用和智能指针。