2013-12-18 21 views
6

"const restrict" işaretçisi argümanları ile aynı mıdır? <code>dot_product</code> Eğer

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

olarak ilan edilir C99 standardına göre,

dot_product(x, x, x_len) 

"tanımsız" olarak onu çağıran ki?

x

Düzenleme elbette bir işaretçi olduğu x_lenunsigned olan bellek sizeof(float) * x_len bayt, işaret. Bu soru takma ile ilgilidir.

+0

Teklif vermek için standartım yok, ancak tanımlanmamış bir davranış olduğunu hayal etmeliyim. Derleyiciye, başka hiçbir işaretçinin aynı bellek konumuna başvurmadığını ve bu ipucunu ihlal ettiğini açıkça söylüyorsunuz. Biliyorum, yapının bunu etkileyeceğini. –

+0

Kendimle çelişki kurmak için: dot_product bir nokta ürünün normal tanımıysa, o zaman bunun bir önemi olmayacağını düşünüyorum. Yani, 'kısıtlama' ihlali sadece işaretçi üzerinde okuma işlemleri gerçekleştirirseniz farketmez. Sadece yazdığınız zaman sorunların oluşmasını beklerim. –

+0

"Düzenleme" yi kaldırmalı mıyım? Gereksiz görünüyor. Şok oldum * iki ** kişi sorumu yanlış anladı. – MaxB

cevap

6

Orijinal C99'um (yani, ISO9899: 1999) metin yok; Sadece ISO9899:2007:TC3'un bir kopyası var. Bu belgenin 111. sayfasından alınan bu metnin C99 standardındaki metne çok benzer olmasını bekliyorum.

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. 

Bu açıkça, davranış tanımlanan sahip olarak sorulduğunda salt okunur erişim için kullanılan ad verilmiş işaretçileri sağlanan formun işlevlerini çağırmak gibi görünüyor. Diğer işaretçilerden herhangi biri ile yazma, tanımlanmamış davranışları çağrıştırır.

-1

Evet. Tanımlanmamış davranışları çağrıştırır. olarak restrict kelime kullanılır ve fonksiyon bildirilmiş

ise:

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

sonra derleyici varsaymak izin verildiğini a ve b farklı yerlere nokta ve diğer işaretçileri etkilemeyecektir bir işaretçi güncellenmesi. Programlayıcı, derleyici değil, işaretçilerden aynı konumlara işaret etmemesini sağlamaktan sorumludur. senin işlev çağrısı yana

diğer neden tanımsız davranışını etkiler a veya b herhangi güncellenmesi, işlevine aynı işaretçi x geçiyor

dot_product(x, x, x_len) 

olduğunu.

+2

Bu, 'restrict' işaretçisi takma sorusunu hiç ele almıyor. –

+0

Seçmene dikkat et. – haccks

+2

Düşündüm çünkü bu soruyla hiçbir şekilde ilgili değil. –

1

Önce parametre olarak geçirilen işaretçileri restrict ait şartname ile çakışan bir şekilde kullanılırsa UB sadece işlevi içinde oluşabilir, çağrı kendisi UB olduğunu düşünmüyorum. (UB, çağrı için fazla bir anlam ifade etmez, eğer (w/sh) yasaklanmışsa, bu bir kısıtlama ihlali yapılmalıydı ve UB değil.)

Daha sonra, restrict ile ilgili UB, yalnızca nesneye işaret edilen "herhangi bir şekilde" değiştirilir. Vektörleriniz değişmediği sürece her şey yolunda. const yeterlilik nedeniyle, bu durumun içinde olmamalıdır. Ve eğer dışarıda bir şey (farklı bir iplik ya da sinyal işleyicisi varsa) vektörlerinizi değiştirirse, her nasıl olursa olsun, sizler de berbatsınız.

İlgili konular