【问题标题】:Access to structure member by pointer通过指针访问结构成员
【发布时间】:2015-06-19 08:04:35
【问题描述】:

我有一个结构,我将其作为常量指针传递给函数,我的问题如下:函数 updatedFields 的这两个实现之间存在差异:

typedef struct
{
    int spec[100];
    int spec1[200];
    int spec2[200];
    int spec3[500];
    int spec4[100];
    int spec5[700];
    float value[100];
    char desc[1000]:
}t_product;



void updateFields_1(t_product const* context)
{

    int i,buffer[1500];
    int * pt_int;

    pt_int = (int*)context->spec1;      
    for(i = 0; i < 200; i++)
    {
        buffer[i] = pt_int[i];
    }

    pt_int = (int*)context->spec3;        
    for(i = 0; i < 500; i++)
    {
        buffer[i] = pt_int[i];
    }

    ...
}

void updateFields_2(t_product const* context)
{

    int i,buffer[1500];

    for(i = 0; i < 200; i++)
    {
        buffer[i] = context->spec1[i];
    }

    for(i = 0; i < 500; i++)
    {
        buffer[i] = context->spec3[i];
    }

    ...
}

int main(void)
{
    t_product prod;

    /* Initialisation of the structure */
    ...

    updateField(&prod);

}

我的意思是,使用指向结构成员的指针(指向数组的指针)而不是直接访问结构成员有任何好处。

这可能是一个愚蠢的问题,但我不知道结构成员的访问是否“花费”更多操作。

【问题讨论】:

  • 请放弃pt_int = (int*)context-&gt;spec3; 的演员表。类型已经兼容,无偿转换可以隐藏错误。
  • 您真的需要for 循环吗?我觉得,对于单个成员(数组类型),你可以直接去memcpy(),不是吗?
  • 它是 int 主要的,而不是 void 主要的。我冒昧地纠正它。

标签: c


【解决方案1】:

在您的情况下,它永远不会花费更多。即使没有优化。实际上,如果您不启用优化,您的 pt_int 示例可能会稍差。

这是因为context-&gt;spec3[i] 没有比pt_int[i] 解引用更多的指针。 pt_int[i] 只是一个指针加上一个偏移量,所以访问可以写成@(ptr_int + 4*i)。在context-&gt;spec3[i] 中,可能看起来还有一个指针被取消引用,但事实并非如此。 spec3 不是 context 中的值,它只是上下文的偏移量。因此,您访问的地址将是@(context + 2000 + 4*i)。只有一个指针访问。

现在您可能想知道@(context + 2000 + 4*i) 的成本是否高于@(ptr_int + 4*i)。它没有,因为大多数架构,包括 x86、AMD64 和 ARM(即 100% 的个人设备),都有指令以恒定偏移量进行访问。此外,一旦启用微不足道的优化,差异就会消失,因为 context + 2000 可以转换为单个 context_2000(但编译器实际上不会这样做,因为它只会降低性能)。

【讨论】:

  • 真的可以说@(context + 2000 + 4*i)@(ptr_int + 4*i) 的成本相同,只是因为有一个使用恒定偏移量进行访问的指令
  • @mastov 是的,因为这意味着它对两者来说是相同的指令,并且偏移量不会使这些指令成本更高(偏移量计算起来很简单)。
【解决方案2】:

它确实花费更多(每次迭代都必须取消引用原始指针),但成本可能很小,一个中途的编译器会为你做这个优化。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-25
    • 1970-01-01
    • 2021-12-11
    • 1970-01-01
    • 2021-07-14
    • 1970-01-01
    • 2011-02-03
    相关资源
    最近更新 更多