我查看过一堆文章,大多数人讲的是同一个故事:除非必须,否则不要使用指针。来自C#/ Java背景,其中内存全部被管理,我完全不知道何时适合使用指针,除了这些情况:
什么时候我会使用指针,特别是在gamedev的上下文中?
答案 0 :(得分:6)
"不要使用指针,他们会慢下来" 没有意义(至少不是C ++)。
这就像说,"不要使用变量,他们会慢下来" 。
您的意思是,"不要使用动态内存分配"?
如果是这样的话:我认为你现在不应该担心它。首先编写代码,然后再进行优化。
或者您的意思是说,"不要使用原始指针(即类型foo*
)",这将需要new
和delete
?
如果是这样,那就是好建议:您通常需要智能指针来代替shared_ptr
或unique_ptr
来管理对象,而不是处理原始指针。在大多数C ++代码中,您不应该使用new
和delete
,即使这看起来很自然。
但他们仍然是引擎盖下的指针!
或者你的意思是什么?
感谢下面的@ bames53指出这一点:
如果传递副本是一个选项(即当你传递小数据量时,不是一个巨大的结构或一个可能大于一些寄存器,例如~16字节的数量级),不使用指针(或引用)来传递数据;而是通过副本传递。它允许编译器以这种方式更好地进行优化。
答案 1 :(得分:3)
指针的一个主要用途(尽管引用通常在可能的情况下通常更好),是能够在没有复制的情况下传递对象。如果一个对象包含大量数据,那么复制它可能非常昂贵且不必要。在游戏开发方面,您可以将指针存储在像std::vector
这样的容器中,这样您就可以管理游戏中的对象。例如,你可以有一个包含指向游戏中所有敌人的指针的向量,这样你就可以对它们执行一些“大规模程序”。研究智能指针也许是值得的,因为这些可以让你的生活变得更轻松(它们在防止内存泄漏方面有很大的帮助)。
答案 2 :(得分:2)
这个想法是你不想让内存泄漏,也不想在检索内存时减慢程序,所以,如果你预先分配你需要的结构,那么你可以使用指针传递结构,因为这比复制结构更快。
我认为你很困惑为什么指针可能被认为是坏的,因为有很多地方可以使用它们,你只需要考虑你为什么这样做。
答案 3 :(得分:1)
您不需要可变大小数组的指针,您可以(通常应该)使用std::vector
代替。你也不需要用于多态的原始指针;虚函数适用于unique_ptr
等智能指针。
在现代C ++中,你很少需要指针。通常它们会被隐藏在资源拥有的类中,如矢量。要传递对象而不复制它们,您可以使用引用。指针的大多数剩余用法都被智能指针覆盖。很少你会想要一个'非拥有'指针,在这种情况下,原始指针就可以了。
如果你了解应该使用的东西而不是指针,你将学习指针的适当用法。所以要了解RAII,参考资料和smart_pointers。