Языки имеют подобные наборы функций. Различие в производительности прибывает из того, что Фортран говорит, что искажение не позволяется, если оператор EQUIVALENCE не используется. Любым кодом, который имеет искажение, не является допустимый Фортран, но это до программиста а не компилятора для обнаружения этих ошибок. Таким образом компиляторы Фортрана игнорируют возможное искажение указателей памяти и позволяют им генерировать более эффективный код. Смотрите на этот небольшой пример в 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;
}
}
Эта функция работала бы медленнее, чем дубликат Фортрана после оптимизации.Как же так? Если Вы пишете значения в выходной массив, можно изменить значения матрицы. В конце концов, указатели могли наложиться и указать на тот же блок памяти (включая int
указатель!). Компилятор C вынужден перезагрузить четыре матричных значения из памяти для всех вычислений.
В Фортране компилятор может загрузить матричные значения однажды и сохранить их в регистрах. Это может сделать так, потому что компилятор Фортрана предполагает, что указатели/массивы не накладываются в памяти.
, К счастью, restrict
ключевое слово и строгое искажение были представлены стандарту C99 для рассмотрения этой проблемы. Это хорошо поддерживается в большинстве компиляторов C++ в эти дни также. Ключевое слово позволяет Вам давать компилятору подсказку, что программист обещает, что указатель не искажает ни с каким другим указателем. Строгое искажение означает, что программист обещает, что указатели другого типа никогда не будут накладываться, например, double*
не наложится с int*
(за определенным исключением, которое char*
и void*
может наложиться с чем-либо).
при использовании их, Вы получите ту же скорость от C и Фортрана. Однако способность использовать restrict
ключевое слово только с производительностью, критические функции означают, что C (и C++) программы намного более безопасны и легче записать. Например, рассмотрите недопустимый код Фортрана: CALL TRANSFORM(A(1, 30), A(2, 31), A(3, 32), 30)
, который большинство компиляторов Фортрана счастливо скомпилирует без любого предупреждения, но представляет ошибку, которая только обнаруживается на некоторых компиляторах на некоторых аппаратных средствах и с некоторыми опциями оптимизации.
Вы можете указать параметр antialias = none
для своих шрифтов, как указано в GNU Emacs Manual