2015-11-03 13 views
1

C是否犯了Vaxocentrism是一個數組塊的memcpy?是C Vaxocentrist中的數組memcpy?

實施例:

double A[10]; 
double B[10]; 
// ... do stuff ... 
// copy elements 3 to 7 in A to elements 2 to 6 in B 
memcpy(B+2, A+3, 5*sizeof(double) 

作爲一個相關的問題,從陣列中鑄造的指針Vaxocentrist?

char A[10]; 
char* B = (char*)A; 
B[0]=2; 
A[1]=3; 
B[2]=5; 

我當然明白編寫在不同的計算機體系結構和不同的編譯器代碼工作的想法,但如果我申請類型安全發揮到了極致,將削弱許多C'S實用的功能!對於編譯器如何實現數組/指針/等,我可以假設多少/少?

+0

(一)沒有,真的沒有。 (b)不,不是。你可以看看標準,看看它說什麼。它確實爲編譯器提供了很大的自由度,但是你必須走出你的主要問題。如果你嘗試,你當然可以自己釘;大多數人不覺得有必要努力嘗試。 –

+1

該鏈接的文章很長;你關心的具體失敗模式是什麼? –

回答

6

memcpy適用的模型在C語言標準指定的抽象機器中定義,與任何可能運行的特定物理機器無關。特別地,C中的所有對象都具有表示,其被定義爲類型unsigned char[sizeof object]的重疊數組,並且memcpy適用於該表示。同樣,通過強制轉換或隱式轉換將數組「指向」衰減「在抽象機器上完全定義,並且與物理機器無關。

此外,鏈接文章中沒有任何一點與您詢問的代碼有關。

+0

是的,這不是列出的要點之一。這就是爲什麼我不確定它是否是vaxocentrist。 –

0

在C代碼中,memcpy()在幾種情況下可以是一種有用的優化。首先,如果內存數組非常小,那麼複製操作通常可以直接由編譯器內聯,而不是調用函數。這可能是一個運行很多的緊密循環中的重大勝利。其次,在陣列非常大的情況下,硬件支持某些對齊內存情況下更快的內存訪問模式,那麼更快的代碼可以用於絕大多數內存。你真的不想知道對於不同硬件的對齊和複製操作的可怕細節,最好只將這些東西放在memcpy()中,讓每個人都使用它。

+0

我不明白這是如何回答這個問題的。 –

+0

好的,簡短的回答是「不」。這個描述詳細說明了爲什麼你不想假設硬件的問題,以及memcpy()如何/何時可以在沒有這種假設的情況下爲你帶來好處。 – MoDJ

-2

對於第一個示例,您正確使用了+運算符。你想要尊重它指向的元素。這是安全的,因爲兩個數組的大小都是10,並且在爲數組分配內存時,所有地址都相對於元素0是連續的。另外,您的複製不會超出您正在複製的聲明數組的範圍於B.

memcpy(&B[2], &A[3], 5*sizeof(double)); 

在您的相關點,你犯同樣的錯誤,你要做到以下幾點:

char A[10]; 
char* B = &A[0]; 
B[0]=2; 
A[1]=3; 
B[2]=5; 
+0

「你錯誤地使用了+運算符」你覺得呢? –

+0

我有理由使用加法運算符。指針運算讓我抵消一個數組。問題是這是否是vaxocentrist。 –

+1

@BigEndian有趣的是,你理解指針衰變的概念,它使'B + 2'成爲'memcpy'的一個有效參數,但是你選擇詢問'(char *)A'是否是'A'的表達式, ,衰變後,轉換爲**它已經有**的類型,是Vaxocentrism。 –