В большинстве современных реализаций C преобразование указателя одного типа в указатель другого типа приводит к нулевым или незначительным затратам производительности.Более серьезной проблемой будет перемещение данных между регистрами общего назначения и регистрами с плавающей запятой.
Как вы заметили, код в вашем вопросе имеет нарушения строгих правил псевдонимов C, хотя ваша реализация C может его поддерживать.Тем не менее, есть две альтернативы:
Если обстоятельства in
, out
и ваша реализация C поддерживают доступ к содержимому как float
, используйте:
float *fin = in, *fout = out;
fout[0] = fin[1] - fin[0];
Еслидоступ к данным как float
не поддерживается, затем используйте:
char *p = in;
float c, d, e;
memcpy(&d, p, sizeof d);
memcpy(&c, p + sizeof d, sizeof c);
e = c - d;
memcpy(out, &e, sizeof e);
Обратите внимание, что хотя memcpy
номинально хуже в абстрактной машине C (он копирует байты один за другим), хорошая реализация Cоптимизирует этот код.(Если выравнивание in
и out
не является проблемой, то для типичных процессоров хороший компилятор должен генерировать две нагрузки, вычитание и хранилище. Если выравнивание является соображением, некоторая форма невыровненных загрузок и хранилищможет понадобиться. Но они понадобятся в любом случае.)