![]() |
|
![]() ![]() ![]() |
|
ksili |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2069 Регистрация: 3.11.2005 Где: Красноярск Репутация: 1 Всего: 17 |
-------------------- Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с) |
|||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 26 Всего: 459 |
Процессор, так вообще, загружает кэш линиями по 32-64 байта, но ведь если было обращение к одному полю, то велика вероятность использования и другого. С другой стороны кэш процессора должен уметь адресовать 1 байт, ведь суть ассемблера в том, что это инструкции процессора. Однако все не так красиво, когда производиться копирование из 4х байтовых типов в однобайтовые и наоборот. Там действительно имеет место очистка старших регистров и всякое такое. Я пытался нагуглить в чем суть оптимизации выравнивания, но толком ничего не нашел. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 48 Всего: 223 |
Суть оптимизации выравнивания в том, что при доступе в память за значением, выравненном на его размер (т.е. 4х байтовый int должен быть выровнен на 4х байтовую границу), процессор читает/пишет это значение за 1 обращение в память, если же значение не выровнено, то ему придется сделать 2 обращения в память.
Например мы пытаемся прочесть int с адреса 0x1001: будет произведено чтение 3х байтов с 0x1001 (точнее четырех с 0x1000 и младший байт будет отброшен) и одного с адреса 0x1004, потом эти куски будут склеены. Занимается этим специальная аппаратура в процессоре, параллельно с работой самого ядра процессора. Так что не выровненные данные замедляют работу, но менее, чем в 2 раза. Кстати, в современных x86 процессорах есть бит в одном из CR регистров, который отключает эту аппаратуру. При этом все не выровненные чтения и записи будут выдавать прерывания (и считаться багами ![]() |
|||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 26 Всего: 459 |
xvr, получается, что при извлечении одного байта, по нечетному адресу, он все равно достанет 4 байта, но уже по выравненному. В любом случае это не потребует 2х обращений к памяти для одного байтового поля (несмотря на то что адрес не кратен 4м). Получается, что оптимизация никак не связана с конвертированием байтов в слова и двойные слова и обратно.
Добавлено через 2 минуты и 40 секунд
Этого я с лихвой накушался при работе с ARM процами. Там проверка выравнивания стоит по умолчанию. Кстати позволяет быстрее опознавать баги с затиранием указателей, поскольку вероятность записать нечетное значение в ячейку адреса велико. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
xvr |
|
||||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 48 Всего: 223 |
Да, не потребует
Это сообщение отредактировал(а) xvr - 24.6.2010, 13:31 |
||||||
|
|||||||
![]() ![]() ![]() |
Правила форума "С++ Builder" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C++ Builder | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |