c++ - 取消引用指针以获取值或创建本地对象并以这种方式访问​​值更好吗?

标签 c++ performance pointers

例如,我正在遍历一个指针 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/

相关文章:

java - Libgdx - 如何加载一个巨大的 Sprite 表,使其不呈现黑色?

performance - 为什么 HTTPS 页面请求可能比 HTTP 更快?

c - 使数组指向另一个数组的内存 C

c++ - 促进 ASIO TCP 消息分离

c++ - 将 boost::optional 与常量类型一起使用 - C++

c++ - 是否可以检查名称为字符串的函数是否存在?(C++)

python - 替代 numpy roll 而不复制数组

C++模板非类型参数类型推导

c - 如何在函数内部将单个指针传递给结构并修改该结构变量?

c++ - 指针是双向迭代器?