2015-03-18 10 views

cevap

22

:

__attribute__((pure)) işlev davranışları
Birçok işlevleri değer döndürmek için dışında hiçbir etkileri vardır ve onların dönüş değeri sadece parametrelere ve global değişkenlere bağlıdır. Bu tür işlevler veri akışı analizine tabi olabilir ve ortadan kaldırılabilir.

__attribute__((const)) işlev davranışları
Birçok fonksiyonlar kendilerine geçirilen yalnızca argümanları incelemek ve dönüş değeri dışında hiçbir etkileri vardır. Bu, global belleğin okunmasına izin verilmediği için, __attribute__((pure))'dan çok daha sıkı bir sınıftır. Bir fonksiyonun sadece argümanlarında çalıştığı biliniyorsa, ortak alt-ifade eleme ve döngü optimizasyonlarına tabi olabilir.

Yani, TL; DR: __attribute__((const))__attribute__((pure)) olarak değil, küresel değişkenlere erişimi olmayan aynıdır. argümanları ve global değişkenler durumuna bağlıdır

+2

ARM derleyicisinin 'pure' özniteliğinden daha katı olan ve' const' özniteliğine eşdeğer olan bir '__pure' işlev niteleyicisi de sağladığını unutmayın. – ysap

+7

Ayrıca dikkat etmek de, GCC belgesindeki işaretçi argümanlarıyla ilgili nottur: 'İşaretçi argümanlarına sahip olan ve işaret edilen verilerin incelenen bir işlev olmaması gerektiğini unutmayın. – origo

2

fark GCC manuals

__attribute__ ((pure)) açıklanmıştır fonksiyonu hiçbir yan etkisi olduğu anlamına gelir ve değer geri döndü. Bu nedenle, optimize edicinin argümanları aynı ise ve çağrıların arasında değişmeyen hallerin değişmesi durumunda, bazı çağrıları elemek güvenlidir. bağımsız değişkenler herhangi ardından işaretçiler duruma gelmiş olmamalıdır işaretçiler ise

__attribute__ ((const)) dönüş değeri sadece bağımsız değişkenlerin bir fonksiyonu olan, ve anlamına gelir.

A const işlevi her zaman pure'dir. const fonksiyonların

Örnekler <math.h> matematiksel fonksiyonlar şöyle olacaktır: (onlar yuvarlama modları tabi olabilir rağmen) vb sqrt, exp. pure ancak const olmayan fonksiyonların

örnekleri strlen gibi fonksiyonları olacaktır - geçirilen işaretçi dereferences olarak

İlgili konular