Создание эффективных WIN32-приложений с учетом специфики 64-разрядной версии Windows


Выравнивание данных - часть 5


pvDataBuffer = (PVOID)((PBYTE) pvDataBuffer + 1);

// байты 2-5 в буфере содержат значение типа DWORD
DWORD dw = * (__unaligned DWORD *) pvDataBuffer;

// Предыдущая строка заставит компилятор сгенерировать дополнительные
// машинные инструкции, которые позволят считать значение типа DWORD
// в несколько приемов При этом исключение из-за попытки доступа
// к невыровненным данным не возникнет

}

При компиляции следующей строки на процессоре Alpha, генерируется 7 машинных инструкций

DWORD dw = * (__unaligned DWORD *) pvDataBuffer;

IIo если я уберу ключевое слово _unaligned, то получу всего 3 машинные инструкции Как видите, модификатор _unaligned на процессорах Alpha приводт к увеличению числа генерируемых машинных инструкций более чем в 2 раза. Но инструкции, добавляемые компилятором, все равно намного эффективнее, чем перехват процессором попыток доступа к невыровненным данным и исправление таких ошибок операционной системой.

И последнее. Ключевое слово _unaligned на процессорах типа x86 компилятором Vtsual С/С++ не поддерживается. На этих процессорах оно просто не нужно. Но это

означает, что версия компилятора для процессоров x86, встретив в исходном коде ключевое слово _unaligned, сообщит об ошибке Полому, если Вы хотите создать единую базу исходного кода приложения для обеих процессорных платформ, используйте вместо _unahgned макрос UNAUGNED Он определен в файле WmNT.h так

#if defined(_M_MRX000) defined(_M_ALPHA) defined(_M_IA64)

#define UNALIGNED _unaligned

#if defined(_WIN64)

#define UNALIGNED64 __unaligned

#else

#define UNALIGNED64

#endif

#else

#define UNALIGNED

#define UNALIGNED64

#endif




Начало  Назад