gpt4 book ai didi

c++ - 使用 static_cast 处理混合(基础和派生)对象的 vector 是否存在性能风险? (又名 "it this a dumb idea?")

转载 作者:可可西里 更新时间:2023-11-01 18:29:30 26 4
gpt4 key购买 nike

给定基类 gameObject 和派生类 animatedGameObject,我认为将它们的所有实例存储在 std::vector 。如果 vector GameObjects 声明为 gameObject* 的基类型,则派生对象实例需要强制转换。

例子:

vector<gameObject*> GameObjects;

gameObject A* = new gameObject( ...init... );
animatedGameObject B* = new animatedGameObject( ...init... );

GameObjects.push_back(A);
GameObjects.push_back(B);

// to access the animatedGameObject functions:
static_cast<animatedGameObject*>(GameObjects[1])->functionUniqueToAnimated();

像往常一样害怕,我求助于 Scott Meyers(Effective C++,第 3 版),他写了关于这个主题的文章:

许多程序员认为强制转换只是告诉编译器将一种类型视为另一种类型,但这是错误的。任何类型的类型转换(通过强制转换显式转换或编译器隐式转换)通常会导致代码在运行时执行。

我已经阅读了他的第 27 条:最小化施法两次,但鉴于我对此缺乏经验,我无法回答一个简单的问题“这是一件愚蠢的事情吗?”

我应该提一下,有几个原因是一件愚蠢的事情,与调用 static_cast 无关。这些问题按重要性排序是:

  1. 在我上面的示例中,我没有看到使用 static_cast 可能存在的风险吗?
  2. 对于这种方法,是否有比 std::vector 更好的数据结构? (只有当有一个很明显时,我才不会要求你为我做研究。)

这是我第一次在这里提问,如有必要,请提前致歉。

最佳答案

static_cast不是完成这项工作的正确工具,除非您知道指针指向 animatedGameObject而不是 gameObject .您使用什么数据结构来存储该信息?

在基指针之后确定派生对象的类型是动态调度的工作或 dynamic_cast .在您的示例中,调用 GameObjects[1]->draw()应该没有强制转换,因为 draw应该是一个虚函数。否则你可以使用 dynamic_cast< animatedGameObject & >( * GameObjects[1] )断言该对象是一个动画游戏对象,并抛出 std::bad_cast如果不是,则异常(exception)。 (这仍然需要 virtual 中的 class gameObject 函数,通常是它的析构函数。)

但是做static_cast多态派生类型是一种代码味道。


另外你问是否std::vector是这个用例的一个很好的数据结构。它是,但不是“裸”指针的 vector 。 C++11 现在提供了执行 new 的“智能指针”内存管理类和 delete对您来说,使实际的运算符几乎已过时。查看std::unique_ptr对于这种情况。

关于c++ - 使用 static_cast 处理混合(基础和派生)对象的 vector 是否存在性能风险? (又名 "it this a dumb idea?"),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17396893/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com