[英]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.