![]() |
|
![]() ![]() ![]() |
|
livo |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 104 Регистрация: 14.10.2007 Репутация: 1 Всего: 1 |
Откуда взялись лишние 3 байта!? В чем может быть причина? |
|||
|
||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 18 Всего: 135 |
Project Options/Advanced Compiler/Data alignment
Погугли про выравнивание данных. а чтобы было 5 байт нужно
-------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 26 Всего: 459 |
livo, выравнивание размеров полей и границы структуры. Добавляются лишние байты, грубо говоря.
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
Alca |
|
||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 25 Всего: 50 |
По максимальному?
А смысл какой? |
||||
|
|||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 26 Всего: 459 |
Alca, оптимизация по быстродействию. Меньше инструкций для доступа к полям.
Не всегда. Если подряд идут 4 байтовых поля, или 2 двухбайтовых, то выравнивая не происходит. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
null56 |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 721 Регистрация: 19.3.2008 Репутация: нет Всего: 12 |
выравнивание по двойному слову по умолчанию (вроде бы), в студии тоже самое... чтобы изменить это выравнивание (в студии), необходимо перед объявлением структуры прописать
, где целым числом будет величина выравнивания, можно выставить единицу, а после структуры
Но опять же это для студии, не знаю, как в билдере http://forum.sources.ru/index.php?showtopi...0&st=0& Это сообщение отредактировал(а) null56 - 23.6.2010, 16:19 |
||||
|
|||||
borisbn |
|
||||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 18 Всего: 135 |
я ж написал:
Если массивом (типа char x[ 4 ]), то да, не происходит, а если в структуре (типа char a; char b; ... ) то происходит, и не по максимальному полю, а по размеру, указанному в опциях проекта или явно в коде (#pragma pack), причём у последнего приоритет. Смотри, например такая структура
при выравнивании на 4 байта располагается в памяти след. образом:
Можешь проверить:
Это сообщение отредактировал(а) borisbn - 23.6.2010, 16:49 -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
||||||||||
|
|||||||||||
livo |
|
||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 104 Регистрация: 14.10.2007 Репутация: 1 Всего: 1 |
Вот еще по выравниванию. Может кому пригодится:
http://forum.sources.ru/index.php?showtopic=110906 http://konishchevdmitry.blogspot.com/2010/01/blog-post.html Насколько я понял подобные директивы:
заставляют компилятор размещать данные структуры друг за другом. В таком случае, почему не работает корректно следующий код:
Почему так? |
||||
|
|||||
borisbn |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 18 Всего: 135 |
livo, в твоём примере
делает следующее: получается указатель на структуру s и этот указатель смещается на один s вперёд.
смещается на пять s вперёд и т.д. если хочешь "гулять по памяти, нужно получить указатель на char, а затем его инкрементировать:
-------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
||||||
|
|||||||
livo |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 104 Регистрация: 14.10.2007 Репутация: 1 Всего: 1 |
borisbn, спасибо. Все понял.
|
|||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 26 Всего: 459 |
Вы бы хоть проверили перед тем как писать
sizeof(tmp) - 8 байт. Это давно известно, многие виндовые структуры так определены, чтобы не занимать лишнего места и не иметь проблем с настройками компилятора. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 18 Всего: 135 |
Alexeis, да, действительно... ступил чуток. Вот интересно, в чём же здесь оптимизация, если я очень часто обращаюсь к tmp::b2 ?
получается, что доступ к этому полю доступ организуется примерно так (псевдо-код):
т.е. вместо одной операции (*(DWORD*)) деается две ? -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
Alexeis |
|
||||||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 26 Всего: 459 |
В том то и дело, что нет. Обратимся к билдеровскому дизасемблеру
Всего одна ассемблерная инструкция. Добавлено через 6 минут и 27 секунд borisbn, возможно оптимизация состоит только в ускорении копирования таких структур двойными словами. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
||||||
|
|||||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 18 Всего: 135 |
Alexeis, убедил, но ведь byte ptr по логике должна быть всё равно дольше - шина данных у процессора больше 8 бит, и ему придётся маскировать данные перед выполнением byte ptr
Хотя... думаю с таким заморачиваться не только не стОит, но и вредно ![]() Добавлено через 3 минуты и 17 секунд И в чём тогда преимущества выравнивания, если к любому члену можно обратиться через byte ptr или word ptr ? -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
ksili |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2069 Регистрация: 3.11.2005 Где: Красноярск Репутация: 1 Всего: 17 |
А по-моему нет тут никакого выравнивания: int - 4 байта и bool - 4 байта.
-------------------- Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с) |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++ 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. |