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

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

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

Сообщение zub » 12.12.2005 16:49:51

Чето не могу найты как в FP (WIN32) управлять выравниванием данных в памяти и как он выравнивает по умолчанию?
zub
долгожитель
 
Сообщения: 2886
Зарегистрирован: 14.11.2005 23:51:26

Сообщение STAKANOV » 13.12.2005 03:04:50

<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:
Аватара пользователя
STAKANOV
энтузиаст
 
Сообщения: 1069
Зарегистрирован: 14.05.2006 21:26:24
Откуда: Зеленоград

Сообщение Иван Шихалев » 13.12.2005 08:19:13

Если я не ошибаюсь, $ALIGN работает только в режиме MacPas...
Аватара пользователя
Иван Шихалев
энтузиаст
 
Сообщения: 1138
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург

Сообщение STAKANOV » 13.12.2005 21:14:08

Сам я никогда ей не пользовался, так выравнивание по умолчанию в FPC 2.0.0 было 4 байта. Согласно статьи Криса Касперски из журнала "Системный админристратор" (что-то там про оптимизацию, ссылки нет) оптимальный варинт для i386 это 4 байта. FPC везеде в ассемблерном коде вставлял (по-умолчанию) директиву balign 4. В версии 2.0.2 он генерит что-то страшное :blink:
Аватара пользователя
STAKANOV
энтузиаст
 
Сообщения: 1069
Зарегистрирован: 14.05.2006 21:26:24
Откуда: Зеленоград

Сообщение Иван Шихалев » 14.12.2005 10:02:13

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

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

Сообщение STAKANOV » 14.12.2005 13:30:07

Код: Выделить всё
.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)?
Аватара пользователя
STAKANOV
энтузиаст
 
Сообщения: 1069
Зарегистрирован: 14.05.2006 21:26:24
Откуда: Зеленоград

Сообщение Иван Шихалев » 14.12.2005 14:04:01

Разное выравнивание для кода и данных - понятно. А вот .balign 8 - странненько.
Аватара пользователя
Иван Шихалев
энтузиаст
 
Сообщения: 1138
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург

Сообщение STAKANOV » 14.12.2005 21:27:36

Это скомпелированный с -a файл (там еще balign полно):
Код: Выделить всё
program hello;
begin
writeln('hello');
end;


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

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

Сообщение Иван Шихалев » 15.12.2005 08:57:51

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

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

Сообщение Nikoilay » 15.12.2005 09:32:03

А какая разница выравнивает или нет?
Если надо, чтобы не выравнивал - packed class, packed record. Если неважно, то пусть сам как удобней компилятору, так и делает. Разве нет?
Nikoilay
 

Сообщение STAKANOV » 15.12.2005 16:06:14

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

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

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

так как авторы компилятора обычно знают что делают, то да. Это наверно из-за кеширования. Может кто точно не знает? :unsure:
Аватара пользователя
STAKANOV
энтузиаст
 
Сообщения: 1069
Зарегистрирован: 14.05.2006 21:26:24
Откуда: Зеленоград

Сообщение Mirage » 16.12.2005 09:20:40

На 16 байт хорошо выравнивать данные для обработки с помощью SSE.
А просто так - наверное для кеша.
Mirage
энтузиаст
 
Сообщения: 881
Зарегистрирован: 06.05.2005 20:29:07
Откуда: Russia


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 57

Рейтинг@Mail.ru