İlk önce bazı referanslar.'restrict' anahtar kelimesi - Neden bir dış kısıtlanmış değişkenden iç kısıtlı değişkene atanmasına izin verilir?
bir kısıtlama nitelikli işaretçi üzerinden erişilen bir amacı bu işaretçi ile bir özel bir ilişki vardır: C99 Standard bu konuda
restrict
bölüm 6.7.3 der. 6.7.3.1'de tanımlanan bu ilişki, o nesneye yapılan tüm erişimlerin, o işaretçinin değerini doğrudan veya dolaylı olarak kullanmasını gerektirir. 117) optimizasyonu teşvik ve dan anlamını değiştirmez bir uyan programı oluşturan tüm ön işleme çeviri birimlerini eleme tüm örneklerini silme içinregister
depolama sınıfı gibirestrict
eleme (içinde kullanımını) 'dir amaçlanan (yani gözlemlenebilir davranış. Daha sonra
ve (§6.7.3.1 "restrict
Formal tanımı"):
D
bir Sınırla gibi bir nesneP
tayin için bir araç sağlayan normal bir tanımlayıcının bir beyan olsun nitelikli işaretçiT
yazın.D
bir blok içinde görünen ve depolama sınıfıextern
yoksa,
, bir işaretçi ekspresyonB
blok gösterelim. Bir işlev tanımının bildirimleri listesindeD
görünüyorsa,B
izin verilen satırını belirtin. Aksi halde,B
'un ana bloğunu (ya da bağlantısının ne anlama geldiği ortamının program başlangıcında çağrılan herhangi bir işlevini belirtmesine izin verin) bırakın. Bundan sonraki bölümde,E
nesneP
ile göre olduğu söylenir halindeP
modifiye bir kopyasına işaret (E
arasında değerlendirme öncesindeB
yürütülmesinde bir dizi noktasında) Önceden işaret ettiği dizi nesnesiE
değerini değiştirir. 119) Not '' temel '' yalnızca işaretçi türündeki ifadeler için tanımlanmıştır.B
her bir çalıştırma sırasında ,L
P
göre&L
sahip herhangi lvalue olsun.L
,X
nesnesinin değerine erişmek için belirtilirse veX
da (herhangi bir yöntemle) değiştirilirse, aşağıdaki gereklilikleri uygulanır:T
, kalifiye olmaz.X
değerine erişmek için kullanılan diğer tüm değer değişimi daP
numaralı adrese sahip olacaktır.X
değiştiren her erişim, için, bu alt bölümün amaçları içinP
'u değiştirmek için de dikkate alınacaktır.P
blokB2
ilişkili nesneP2
,B2
sonra icra yaB
yürütülmesi veyaB2
-ecek yürütülmesinden önce başlayacaktır başka sınırlı işaretçi dayanan bir işaretçi ekspresyonE
değerini atanırsa ödevden önce bitirmek. Bu gereksinimler karşılanmazsa, davranışı tanımlanmamıştır. Şimdi{ int * restrict p1; int * restrict q1; p1 = q1; // undefined behavior { int * restrict p2 = p1; // valid int * restrict q2 = q1; // valid p1 = q2; // undefined behavior p2 = q2; // undefined behavior } }
, benim ilk soru şudur: neden sorun için bir dış kısıtlı işaretçi atamak some have pointed out olarak
, bu (standardından Örnek 4) kurallarını göstermektedir bir iç?
Benim anlayış hiçbir şey net aliasing olan bu yasaklar şudur:
Tabiiint * restricted x = /* ... */ ;
{
int * restricted y = x;
*x = 3;
printf("%d\n", *y); // 3
*y = 4;
printf("%d\n", *x); // 4
}
, takma seti iki işaretçiler ile sınırlıdır.
Dolayısıyla benim ikinci soru: (yukarıdaki ilk örnekte, örneğin, yasak p1 = q1;
) (izin), ancak iç dış iç dış atanmasıyla fark nedir?
Lütfen, gerçekten derlediğinden, değiştirin. – gnasher729
Bir işaretçiyi parametre listesinde bir işleve 'kısıtlama' olarak bildirebileceğiniz tek yer bu değildi. – fuz
@FUZxxl Hayır, standart böyle söylemez ve tüm uyarılara ve sıkı standart uyumluluğuna sahip olarak mükemmel çalışır. – Norswap