【问题标题】:Advantage/Disadvantage of function pointers函数指针的优点/缺点
【发布时间】:2011-08-09 04:40:00
【问题描述】:

所以我遇到的问题实际上还没有发生。我正在为我目前正在开发的游戏计划一些代码,并且我知道我需要从第一步开始尽可能地节省内存使用量。

我的问题是,例如,如果我有 500k 个需要不断构建和解构的对象。会为我节省任何内存以将这些类用作函数指针的函数。

例如没有函数指针
class MyClass
{
public:
void Update();
void Draw();
...
}

例如带函数指针

class MyClass
{
public:
void * Update;
void * Draw;
...
}

这会节省我的内存吗,或者 MyClass 的任何新创建只会访问为其余部分定义的相同函数?如果它确实为我节省了任何记忆,那是否值得?

【问题讨论】:

  • 那些不是函数指针,应该是void (*Update)(void);
  • 函数不会“衡量”任何东西,因为您可以通过检查 sizeof 您的对象轻松说服自己。但是,(函数)指针可以。

标签: function pointers memory-management


【解决方案1】:

假设这些不是虚函数,您将 更多 将内存与函数指针一起使用。

第一个例子

没有分配(除了使new返回唯一指针所需的基本数量,或者您...椭圆化的额外实现)。

非虚拟成员函数基本上是采用this 指针的静态函数。

优点是您的对象非常简单,您只需在一个地方查找相应的代码。

缺点是您失去了一些灵活性,并且必须将所有代码塞进单个更新/绘制函数中。除了一个小游戏之外,这将很难管理。

第二个例子

您为每个对象实例分配 2x 指针。每个指针通常是 4x 到 8x 字节(取决于您的目标平台和编译器)。

您获得了很大灵活性的优势,即能够在运行时更改您指向的函数,并且可以拥有大量实现它的函数 - 从而支持(但不保证) 更好的代码组织。

缺点是,当您调试应用程序或只是阅读代码时,很难判断每个实例将指向哪个函数。

其他选项

以这种特定方式(实例数据成员)使用函数指针通常在纯 C 中更有意义,而在 C++ 中则不太有意义。

如果您希望在运行时绑定这些函数,您可能希望将它们设为 virtual。成本取决于编译器/实现,但我相信它(通常)将是每个对象实例一个 v-table 指针。

此外,您还可以充分利用虚函数语法来根据类型而不是您将它们绑定到的任何内容来创建您的函数。它比函数指针选项更容易调试,因为您只需查看派生类型即可确定特定实例指向的函数。

您也不必初始化这些函数指针 - C++ 类型系统会自动执行等效的初始化(通过构建 v-table,并初始化每个实例的 v-table 指针)。

见:http://www.parashift.com/c++-faq-lite/virtual-functions.html

【讨论】:

  • 我怀疑是这样的。谢谢。
猜你喜欢
  • 2011-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-08
  • 2021-02-19
  • 1970-01-01
相关资源
最近更新 更多