功能指针的优点/缺点

时间:2011-08-09 04:40:00

标签: function pointers memory-management

所以我遇到的问题实际上还没有发生。我正在为我正在进行的游戏计划一些代码,我知道我将需要尽可能地从第一步节省内存使用量。
我的问题是,如果我有例如需要不断构造和解构的500k物体。将保存我的任何内存以使这些类将用作函数指针的函数。没有功能指针的是class MyClass
{
public:
void Update(); void Draw();
... {
{1}}

例如带功能指针

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

这会为我节省任何内存吗?或者MyClass的任何新创建只会访问为其定义的相同功能其余的?如果它能为我节省任何记忆,那么它是否足够值得?

1 个答案:

答案 0 :(得分:1)

假设这些不是虚函数,你可以使用 more 内存和函数指针。

第一个例子

没有分配(超出使new返回唯一指针所需的基本数量,或者您...进行了优化的其他实现。

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

优点是你的对象非常简单,你只有一个地方可以找到相应的代码。

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

第二个例子

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

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

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

其他选项

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

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

另外,您可以充分利用虚函数语法,使您的函数基于类型,而不是您绑定它们的任何内容。它比函数指针选项更容易调试,因为您可以简单地查看派生类型以找出特定实例指向的函数。

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

请参阅:http://www.parashift.com/c++-faq-lite/virtual-functions.html