例如,我正在遍历一个指针 vector 来检查多个对象并对它们执行操作。我可以执行以下任一操作。
方法一:
std::vector< Object* >::iterator it;
Object* o;
for (it = objects.begin(); it != objects.end(); ++it)
{
o = (*it)
if(o->GetActive())
{
o->method;
o->method2;
o->method3;
//etc...
}
}
方法二:
std::vector< Object* >::iterator it;
for (it = objects.begin(); it != objects.end(); ++it)
{
if((*it)->GetActive())
{
(*it)->method;
(*it)->method2;
(*it)->method3;
//etc...
}
}
据我所知,方法 1 更易于阅读,因为取消引用语法通常会使可读性复杂化,尤其是当您执行以下操作时:
if((*o)->CheckValue((*c)))
但是创建局部变量会使其更易于阅读:
if(o->CheckValue(c))
但是您正在创建额外的变量,这会增加内存成本,对吧?
性能上的差异是什么?
最佳答案
优化编译器可能使它们相同。有时最好分配给一个变量以获得更好的可读性。如果容器不包含指针,您可以使用引用代替:
std::vector< Object >::iterator it;
for (it = objects.begin(); it != objects.end(); ++it)
{
const Object &o = (*it)
if(o.GetActive())
{
o.method();
o.method2();
o.method3();
//etc...
}
}
编辑:正如 Raymond 在评论中指出的那样,如果方法可能会改变所讨论的对象,编译器将无法进行某些优化。解决这个问题的方法是尽可能使用 const
,因此我更改了我的示例以在实践中展示它。如果这样做,您将无法调用未标记为 const
的对象的方法。
关于c++ - 取消引用指针以获取值或创建本地对象并以这种方式访问值更好吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18950836/