Diller benzer özellik setlerine sahiptir. Performans farkı, bir EQUIVALENCE ifadesi kullanılmadığı sürece Fortran'ın takma adlara izin verilmediğini söylemesi gerçeğinden kaynaklanmaktadır. Takma adı olan herhangi bir kod geçerli Fortran değildir, ancak bu hataları algılamak için programcıya ve derleyiciye bağlı değildir. Böylece Fortran derleyicileri, bellek işaretleyicilerinin olası örtüşmesini görmezden gelir ve daha verimli kod üretmelerine olanak tanır. C'deki bu küçük örneğe bir göz atın:
void transform (float *output, float const * input, float const * matrix, int *n)
{
int i;
for (i=0; i<*n; i++)
{
float x = input[i*2+0];
float y = input[i*2+1];
output[i*2+0] = matrix[0] * x + matrix[1] * y;
output[i*2+1] = matrix[2] * x + matrix[3] * y;
}
}
Bu işlev, optimizasyondan sonra Fortran muadilinden daha yavaş çalışır. Neden öyle? Çıktı dizisine değerler yazarsanız, matrisin değerlerini değiştirebilirsiniz. Sonuçta, işaretçiler üst üste gelebilir ve aynı bellek yığınını gösterebilir ( int
işaretçi dahil !). C derleyicisi, tüm hesaplamalar için dört matris değerini bellekten yeniden yüklemeye zorlanır.
Fortran'da derleyici matris değerlerini bir kez yükleyebilir ve bunları kayıtlara kaydedebilir. Bunu yapabilir, çünkü Fortran derleyicisi işaretçilerin / dizilerin bellekte çakışmadığını varsayar.
Neyse ki, restrict
bu sorunu çözmek için C99 standardına anahtar kelime ve katı kenar yumuşatma eklendi. Bugünlerde de çoğu C ++ derleyicisinde desteklenmektedir. Anahtar kelime derleyiciye, programlayıcının bir işaretçinin başka bir işaretçiyle takma olmadığını vaat ettiğine dair bir ipucu vermenizi sağlar. Sıkı örtüşme, programcının farklı türdeki işaretçilerin asla örtüşmeyeceğine söz verdiği anlamına gelir, örneğin a double*
, bir int*
ile örtüşmeyecektir (belirli bir istisna dışında char*
ve void*
herhangi bir şeyle örtüşebilir).
Onları kullanırsanız, C ve Fortran'dan aynı hızı elde edersiniz. Ancak, restrict
anahtar kelimeyi yalnızca performans açısından kritik işlevlerle kullanma yeteneği , C (ve C ++) programlarının daha güvenli ve daha kolay yazılması anlamına gelir. Örneğin, geçersiz Fortran kodunu düşünün:CALL TRANSFORM(A(1, 30), A(2, 31), A(3, 32), 30)
çoğu Fortran derleyicisinin uyarı vermeden mutlu bir şekilde derleyeceği ancak yalnızca bazı derleyicilerde, bazı donanımlarda ve bazı optimizasyon seçeneklerinde görünen bir hata getiren .