2013-12-18 38 views
6

如果dot_product被聲明爲別名「const restrict」指針參數是否合法?

float dot_product(const float* restrict a, const float* restrict b, unsigned n); 

將與

dot_product(x, x, x_len) 

是 「不確定」 調用它,按C99標準?

編輯

x是一個指針,當然,指向sizeof(float) * x_len字節的存儲器,x_lenunsigned。這個問題是關於別名。

+0

我沒有標準引用,但我必須想象它是未定義的行爲。你明確地告訴編譯器沒有其他指針指向相同的內存位置,然後違反該提示。我不認爲'const'會影響這個。 –

+0

自相矛盾:如果'dot_product'是點積的通常定義,那麼我認爲它不會*重要*。也就是說,如果只對指針執行讀取操作,違反'restrict'應該無關緊要。只有當你寫信時,我纔會期望發生問題。 –

+0

我應該刪除「編輯」?看起來多餘。我很震驚** **兩個人誤解了我的問題。 – MaxB

回答

6

我沒有原始的C99(即ISO9899:1999)文本;我只有ISO9899:2007:TC3的副本。我期望從該文件的第111頁獲得的這段文字與C99標準中的文本非常相似。

6.7.3.1 Formal definition of restrict 

... 

10. EXAMPLE 3 

The function parameter declarations 

    void h(int n, int * restrict p, int * restrict q, int * restrict r) 
    { 
     int i; 
     for (i = 0; i < n; i++) 
      p[i] = q[i] + r[i]; 
    } 

illustrate how an unmodified object can be aliased through two restricted 
pointers. In particular, if a and b are disjoint arrays, a call of the form 
h(100, a, b, b) has defined behavior, because array b is not modified within 
function h. 

這似乎明確地提出了您詢問的具有已定義行爲的表單的函數,前提是別名指針用於只讀訪問。通過任何一個別名指針進行寫操作都會調用未定義的行爲。

-1

是的。它會調用未定義的行爲。

如果restrict關鍵字用於和函數被聲明爲:

float dot_product(const float* restrict a, const float* restrict b, unsigned n); 

則編譯器被允許假設ab指向不同的位置和更新一個指針不會影響其他指針。程序員,而不是編譯器,負責確保指針不指向相同的位置

因爲你的函數調用

dot_product(x, x, x_len) 

它傳遞相同的指針x的功能,更新任何的ab會影響到其他導致未定義的行爲。

+2

這並沒有解決'restrict'指針別名問題。 –

+0

下來選民照顧解釋。 – haccks

+2

我低估了,因爲這與這個問題無關。 –

1

首先,我不認爲調用本身是UB,UB只能在函數內發生,如果以參數形式傳遞的指針以與restrict規範衝突的方式使用。 (UB對呼叫沒什麼意義,如果(w/sh)應該被禁止,這應該是違反約束而不是UB)。

然後,與restrict相關的UB只能出現,如果指向對象被「以任何方式」修改。所以只要你的載體沒有被修改,一切都很好。由於const資格,因此在您的功能中不應該發生這種情況。如果外面的東西(比如說一個不同的線程或信號處理程序)修改了你的向量,那麼無論如何你都會被搞砸。

相關問題