使用链接在一起的多个箭头操作符( - >)有什么缺点吗?

hol*_*eap 8 c performance struct pointers

假设我们有一些封装在另一个结构中的结构化数据,这样就可以形成一个循环链表.

typedef struct Data 
{
    int x;
    int y;
} Data;

typedef struct DataNode 
{
    struct DataNode *next;
    struct Data *data;
} DataNode;
Run Code Online (Sandbox Code Playgroud)

假设圆形链表正确构造并*head指向列表的成员,->在链中使用运算符是否有任何缺点(性能或其他方面),尤其是在循环中?

DataNode * findPrevMatching(int x, int y)
{
    // Chained arrow operators in a loop
    while (!(head->next->data->x == x && head->next->data->y == y))  
        head = head->next;

    return head;
}
Run Code Online (Sandbox Code Playgroud)

如果我创建局部变量以便没有链式箭头会有什么区别吗?

DataNode * findPrevMatching(int x, int y)
{   
    DataNode *next = head->next;
    Data *data = next->data;

    while (!(data->x == x && data->y == y))
    {
        // Assign head->next to head
        head = head->next;

        // Assign each local variable, using the new head
        next = head->next;
        data = next->data;
    }

    return head;
}
Run Code Online (Sandbox Code Playgroud)

Dav*_*lor 2

如果您可以创建一个节点数组,在数组中创建前一个和下一个指针索引,并从该池中分配所有节点,那么这可能在给定的体系结构上具有性能优势。连续数组更有可能位于缓存中,您可以告诉操作系统您何时愿意并且不会\xe2\x80\x99t使用该块中的任何节点,例如 或posix_madvise()PrefetchVirtualMemory()您可以使用索引小于指针并获得更小的节点,并且您的 CPU 可能支持间接寻址,这使得查找数组元素与查找指针一样高效。

\n\n

对于纠正连续取消引用指向行中的多个指针的代码来说,可能发生的最糟糕的事情是一系列缓存未命中(或者实际上是页面错误)。

\n\n

不过,要真正回答这个问题,您需要进行分析,找出程序所有时间都花在哪里,重点关注那里,然后再次进行分析,以了解您节省了多少时间。

\n