Выравнивание данных

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Ответить
zub
долгожитель
Сообщения: 2894
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

Чето не могу найты как в FP (WIN32) управлять выравниванием данных в памяти и как он выравнивает по умолчанию?
Аватара пользователя
STAKANOV
энтузиаст
Сообщения: 1069
Зарегистрирован: 14.05.2006 21:26:24
Откуда: Зеленоград

Сообщение STAKANOV »

<a href='http://freepascal.ru/wiki/index.php/%24A_%D0%B8%D0%BB%D0%B8_%24ALIGN_:_%D0%B2%D1%8B%D1%80%D0%B0%D0%B2%D0%BD%D0%B8%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85' target='_blank'>$A или $ALIGN : выравнивание данных</a>

Но выравнивает он как-то странно, в версии 2.0.0 по-моему все выравнивалось по границе 4х байт. А вот в 2.0.2 что-то не понятное. Можешь сам посмотреть сгенерерировав ассемблерный листинг (-a). :blink:
Аватара пользователя
Иван Шихалев
энтузиаст
Сообщения: 1138
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург
Контактная информация:

Сообщение Иван Шихалев »

Если я не ошибаюсь, $ALIGN работает только в режиме MacPas...
Аватара пользователя
STAKANOV
энтузиаст
Сообщения: 1069
Зарегистрирован: 14.05.2006 21:26:24
Откуда: Зеленоград

Сообщение STAKANOV »

Сам я никогда ей не пользовался, так выравнивание по умолчанию в FPC 2.0.0 было 4 байта. Согласно статьи Криса Касперски из журнала "Системный админристратор" (что-то там про оптимизацию, ссылки нет) оптимальный варинт для i386 это 4 байта. FPC везеде в ассемблерном коде вставлял (по-умолчанию) директиву balign 4. В версии 2.0.2 он генерит что-то страшное :blink:
Аватара пользователя
Иван Шихалев
энтузиаст
Сообщения: 1138
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург
Контактная информация:

Сообщение Иван Шихалев »

В версии 2.0.2 он генерит что-то страшное

Что именно?
Аватара пользователя
STAKANOV
энтузиаст
Сообщения: 1069
Зарегистрирован: 14.05.2006 21:26:24
Откуда: Зеленоград

Сообщение STAKANOV »

Код: Выделить всё

.section .text
   .balign 16
   .balign 16
.globl   PASCALMAIN
   .type   PASCALMAIN,@function
PASCALMAIN:
.globl   main
   .type   main,@function
main:
...
.section .data
   .ascii   "FPC 2.0.2 [2005/12/07] for i386 - Linux"
   .balign 8
   .balign 8
.globl   THREADVARLIST_P$HELLO
...
.balign 4
.globl   FPC_THREADVARTABLES
   .type   FPC_THREADVARTABLES,@object
FPC_THREADVARTABLES:
   .long   2
   .long   THREADVARLIST_SYSTEM
   .long   THREADVARLIST_P$HELLO
...

Возможно конечно, что это связано с архитектурой совремнных процессоров. Я просто много чего не знаю (например лишь недавно узнал что для повышения скорости лучше использовать mov вместо push). Есть мнения почему он такое выравнивание задает (то 16, то 8, то 4)?
Аватара пользователя
Иван Шихалев
энтузиаст
Сообщения: 1138
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург
Контактная информация:

Сообщение Иван Шихалев »

Разное выравнивание для кода и данных - понятно. А вот .balign 8 - странненько.
Аватара пользователя
STAKANOV
энтузиаст
Сообщения: 1069
Зарегистрирован: 14.05.2006 21:26:24
Откуда: Зеленоград

Сообщение STAKANOV »

Это скомпелированный с -a файл (там еще balign полно):

Код: Выделить всё

program hello;
begin
 writeln('hello');
end;


Разное выравнивание для кода и данных - понятно. А вот .balign 8 - странненько.

а 16 не странненько?
Аватара пользователя
Иван Шихалев
энтузиаст
Сообщения: 1138
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург
Контактная информация:

Сообщение Иван Шихалев »

а 16 не странненько

Дык, 16-то на код - оптимизация, наверное.
Nikoilay

Сообщение Nikoilay »

А какая разница выравнивает или нет?
Если надо, чтобы не выравнивал - packed class, packed record. Если неважно, то пусть сам как удобней компилятору, так и делает. Разве нет?
Аватара пользователя
STAKANOV
энтузиаст
Сообщения: 1069
Зарегистрирован: 14.05.2006 21:26:24
Откуда: Зеленоград

Сообщение STAKANOV »

А какая разница выравнивает или нет?

при правильном выравнивании быстрей работает

Дык, 16-то на код - оптимизация, наверное.

так как авторы компилятора обычно знают что делают, то да. Это наверно из-за кеширования. Может кто точно не знает? :unsure:
Mirage
энтузиаст
Сообщения: 880
Зарегистрирован: 06.05.2005 20:29:07
Откуда: Russia
Контактная информация:

Сообщение Mirage »

На 16 байт хорошо выравнивать данные для обработки с помощью SSE.
А просто так - наверное для кеша.
Ответить