ภาษามีชุดคุณสมบัติที่คล้ายกัน ความแตกต่างด้านประสิทธิภาพนั้นมาจากข้อเท็จจริงที่ว่า Fortran กล่าวว่าไม่อนุญาตให้ใช้นามแฝงยกเว้นว่าจะมีการใช้คำสั่ง EQUIVALENCE รหัสใด ๆ ที่มีนามแฝงไม่ใช่ Fortran ที่ถูกต้อง แต่ขึ้นอยู่กับโปรแกรมเมอร์และไม่ใช่คอมไพเลอร์เพื่อตรวจหาข้อผิดพลาดเหล่านี้ คอมไพเลอร์ของ Fortran จึงเพิกเฉยต่อนามแฝงของพอยน์เตอร์ของหน่วยความจำที่เป็นไปได้ ดูตัวอย่างเล็ก ๆ น้อย ๆ นี้ใน 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;
}
}
ฟังก์ชั่นนี้จะทำงานช้ากว่าคู่ของ Fortran หลังจากปรับให้เหมาะสม ทำไมเป็นเช่นนั้น หากคุณเขียนค่าลงในอาร์เรย์เอาต์พุตคุณอาจเปลี่ยนค่าของเมทริกซ์ ท้ายที่สุดพอยน์เตอร์สามารถซ้อนทับและชี้ไปที่หน่วยความจำอันเดียวกัน (รวมถึงint
ตัวชี้!) คอมไพเลอร์ C ถูกบังคับให้โหลดค่าเมทริกซ์สี่ค่าจากหน่วยความจำสำหรับการคำนวณทั้งหมด
ใน Fortran คอมไพเลอร์สามารถโหลดค่าเมทริกซ์หนึ่งครั้งและเก็บไว้ในการลงทะเบียน มันสามารถทำได้เพราะคอมไพเลอร์ Fortran ถือว่าพอยน์เตอร์ / อาร์เรย์ไม่ทับซ้อนกันในหน่วยความจำ
โชคดีที่มีการใช้restrict
คำหลักและการใช้ชื่อแทนอย่างเข้มงวดกับมาตรฐาน C99 เพื่อแก้ไขปัญหานี้ มันได้รับการสนับสนุนอย่างดีในคอมไพเลอร์ C ++ ส่วนใหญ่เช่นกัน คำสำคัญช่วยให้คุณสามารถให้คำแนะนำคอมไพเลอร์ที่โปรแกรมเมอร์สัญญาว่าตัวชี้ไม่ได้ใช้นามแฝงกับตัวชี้อื่น ๆ นามแฝงที่เข้มงวดหมายถึงโปรแกรมเมอร์สัญญาว่าพอยน์เตอร์ของประเภทที่แตกต่างกันจะไม่ทับซ้อนกันตัวอย่างเช่นdouble*
จะไม่ทับซ้อนกับint*
(ด้วยข้อยกเว้นเฉพาะที่char*
และvoid*
สามารถทับซ้อนกับสิ่งใดก็ได้)
หากคุณใช้พวกเขาคุณจะได้รับความเร็วเดียวกันจาก C และ Fortran อย่างไรก็ตามความสามารถในการใช้restrict
คำหลักเฉพาะกับฟังก์ชั่นที่สำคัญด้านประสิทธิภาพหมายความว่าโปรแกรม C (และ C ++) นั้นปลอดภัยและง่ายต่อการเขียนมาก ตัวอย่างเช่นพิจารณารหัส Fortran ที่ไม่ถูกต้องCALL TRANSFORM(A(1, 30), A(2, 31), A(3, 32), 30)
ซึ่งคอมไพเลอร์ Fortran ส่วนใหญ่จะรวบรวมอย่างมีความสุขโดยไม่มีการเตือน แต่แนะนำข้อผิดพลาดที่แสดงเฉพาะในคอมไพเลอร์บางตัวในฮาร์ดแวร์บางตัวและตัวเลือกการปรับให้เหมาะสมบางอย่าง