Eski stil FORTRAN, bir dizinin bir bölümünü başlangıç dizisini ve bitiş aboneliğini veya öğe sayısını belirten bir veya daha fazla tamsayı ile birlikte tüm diziye bir başvuru iletmek için gereken bir işlevin kullanılabilir olmasını isteyen bir programcının olmasını gerektiriyordu. . C , eleman sayısıyla birlikte ilgilenilen kısmın başlangıcına bir işaretçi geçirmeyi basitleştirmeyi mümkün kılar . Doğrudan terimlerle, bu işleri daha hızlı hale getirir (üç yerine iki şey geçirir). Ancak dolaylı olarak, bir derleyicinin gerçekleştirebileceği optimizasyon türlerini sınırlayarak işleri yavaşlatabilir.
İşlevi düşünün:
void diff(float dest[], float src1[], float src2[], int n)
{
for (int i=0; i<n; i++)
dest[i] = src1[i] - src2[i];
}
bir derleyici her bir işaretçinin bir dizinin başlangıcını tanımlayacağını biliyorsa, herhangi bir x! = y için, hedef [x üzerindeki işlemlerden dolayı dizinin öğelerine paralel veya herhangi bir sırayla etki edecek kod üretebilir. ] src1 [y] veya src2 [y] 'i etkilemez. Örneğin, bazı sistemlerde bir derleyici aşağıdakilere eşdeğer kod üretmekten yararlanabilir:
void dif(float dest[], float src1[], float src2[], int n)
{
int i=0;
float t1a,t1b,t2a,t2b,tsa,tsb;
if (n > 2)
{
n-=4;
t1a = src1[n+3]; t1b = src2[n+3]; t1b=src2[n+2]; t2b = src2[n+2];
do
{
tsa = t1a-t2a;
t1a = src1[n+1]; t2a = src2[n+1];
tsb = t2b-t2b;
dest[n+3] = tsa;
t1b = src1[n]; t2b = src2[n];
n-=2;
dest[n+4] = tsb;
} while(n >= 0);
... add some extra code to handle cleanup
}
else
... add some extra code to handle small values of n
}
Bir değeri yükleyen veya hesaplayan her işlemde, değerle bu değeri kullanan bir sonraki işlem arasında en az bir işlem daha bulunduğunu unutmayın. Bazı işlemciler, bu koşullar sağlandığında farklı işlemlerin işlenmesiyle çakışabilir ve böylece performansı artırabilir. Bununla birlikte, bir C derleyicisinin kodun ortak bir dizinin kısmen çakışan bölgelerine işaretçiler geçirmeyeceğini bilmesinin bir yolu olmadığından , bir C derleyicisinin yukarıdaki dönüşümü yapamayacağını unutmayın. Ancak, eşdeğer kod verilen FORTRAN derleyicileri böyle bir dönüşüm yapabilir ve yaptılar.
Bir C programcısı, döngüyü açan ve bitişik geçişlerin işlemlerini üst üste bindiren kodu açıkça yazarak karşılaştırılabilir bir performans elde etmeye çalışabilirken, bir derleyicinin bunları hafıza. Bir FORTRAN derleyicisinin eniyileştiricisi, belirli bir senaryoda hangi serpiştirme formlarının en iyi performansı sağlayacağına dair bir programcıdan daha fazlasını bilir ve bu tür kararlar genellikle bu tür derleyicilere bırakılır. C99 bir ekleyerek biraz C'nin durumu iyileştirmek için çalıştı ederken restrict
eleme eğer, o sadece burada kullanılabilecek dest[]
hem ayrı bir dizi oldu src1[]
ve src2[]
ya programcı tüm davalarına bakacak döngünün ayrı versiyonlarını eklenirse dest
ayrık oldusrc1
ve src2
nerede src1[]
ve dest
eşitti ve src2
ayrıktı, nerede src2[]
ve dest[]
eşitti ve src1
ayrıktı ve üç dizinin hepsi eşitti. FORTRAN, aksine, aynı kaynak kodunu ve aynı makine kodunu kullanmakta zorlanmadan dört vakayı da ele alabilir.