Bahasa memiliki set fitur yang serupa. Perbedaan kinerja berasal dari fakta bahwa Fortran mengatakan aliasing tidak diperbolehkan, kecuali jika pernyataan EQUIVALENCE digunakan. Setiap kode yang memiliki alias tidak sah Fortran, tetapi terserah kepada programmer dan bukan kompiler untuk mendeteksi kesalahan ini. Dengan demikian kompiler Fortran mengabaikan kemungkinan aliasing dari memory pointer dan memungkinkan mereka untuk menghasilkan kode yang lebih efisien. Lihatlah contoh kecil ini di C:
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;
}
}
Fungsi ini akan berjalan lebih lambat daripada rekan Fortran setelah optimasi. Kenapa begitu? Jika Anda menulis nilai ke dalam array output, Anda dapat mengubah nilai-nilai matriks. Bagaimanapun, pointer bisa tumpang tindih dan menunjuk ke memori yang sama (termasuk int
pointer!). Kompiler C dipaksa untuk memuat ulang empat nilai matriks dari memori untuk semua perhitungan.
Di Fortran kompiler dapat memuat nilai matriks satu kali dan menyimpannya di register. Hal ini dapat dilakukan karena kompiler Fortran mengasumsikan pointer / array tidak tumpang tindih dalam memori.
Untungnya, restrict
kata kunci dan aliasing ketat telah diperkenalkan ke standar C99 untuk mengatasi masalah ini. Ini didukung dengan baik di sebagian besar kompiler C ++ hari ini juga. Kata kunci memungkinkan Anda untuk memberikan kompiler petunjuk bahwa programmer menjanjikan bahwa pointer tidak alias dengan pointer lain. Aliasing yang ketat berarti bahwa pemrogram berjanji bahwa pointer dari tipe yang berbeda tidak akan pernah tumpang tindih, misalnya a double*
tidak akan tumpang tindih dengan int*
(dengan pengecualian khusus char*
dan void*
dapat tumpang tindih dengan apa pun).
Jika Anda menggunakannya, Anda akan mendapatkan kecepatan yang sama dari C dan Fortran. Namun, kemampuan untuk menggunakan restrict
kata kunci hanya dengan fungsi kritis kinerja berarti bahwa program C (dan C ++) jauh lebih aman dan lebih mudah untuk ditulis. Sebagai contoh, pertimbangkan kode Fortran yang tidak valid:, CALL TRANSFORM(A(1, 30), A(2, 31), A(3, 32), 30)
yang kebanyakan kompiler Fortran akan dengan senang hati mengkompilasi tanpa peringatan apa pun tetapi memperkenalkan bug yang hanya muncul pada beberapa kompiler, pada beberapa perangkat keras dan dengan beberapa opsi optimasi.