簡體   English   中英

通過指針訪問結構成員

[英]Access to structure member by pointer

我有一個結構,我作為常量指針傳遞給一個函數,我的問題如下:函數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);

}

我的意思是,使用指向結構成員的指針(指向數組的指針)而不是直接訪問struture成員有任何好處。

這可能是一個愚蠢的問題,但我不知道結構成員的訪問是否“花費”更多的操作。

在您的情況下,它不會花費更多。 即使沒有優化。 實際上,如果不啟用優化,則pt_int示例可能會稍微惡化一些。

這是因為context->spec3[i]沒有解除引用比pt_int[i]更多的指針。 pt_int[i]只是一個指針和一個偏移量,所以訪問可以寫成@(ptr_int + 4*i) context->spec3[i] ,看起來有一個指針被解除引用,但情況並非如此。 spec3不是context的值,它只是與上下文的偏移。 因此,您訪問的地址為@(context + 2000 + 4*i) 只有一個指針訪問。

現在你可以想知道@(context + 2000 + 4*i)成本是否超過@(ptr_int + 4*i) 它沒有,因為大多數架構,包括x86,AMD64和ARM(即100%的個人設備),都有使用常量偏移進行訪問的指令。 此外,當您啟用簡單的優化時,差異可能很快消失,因為context + 2000可以轉換為單個context_2000 (但編譯器實際上不會這樣做,因為它只會惡化性能)。

它確實花費更多(它必須在每次迭代時取消引用原始指針),但成本可能很小,並且中途不錯的編譯器將為您進行優化。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM