![]() |
|
|
![]()
|
|
| 0xDEAD |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 77 Регистрация: 20.9.2009 Репутация: нет Всего: 3 |
Добрый день.
Есть такой код:
Если компилирую под 32 бит, выдает ОК, если под 64, выдает баг. Это баг, или я что-то не так делаю? Проект в аттаче. Это сообщение отредактировал(а) 0xDEAD - 6.4.2012, 23:57 Присоединённый файл ( Кол-во скачиваний: 4 )
test.rar 2,78 Kb |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Почему сразу баг-то? Выравнивание - вещь гвоздями не прибитая. Ее можно установить как для проекта, так и для любой части кода.
Видимо, в установках проекта разных конфигураций оно разное. Чтобы гарантировать устойчивое выравнивание для каких-то структур, используй #pragma pack (push, N) (вместо N - сколько надо). -------------------- ... |
|||
|
||||
| 0xDEAD |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 77 Регистрация: 20.9.2009 Репутация: нет Всего: 3 |
Посмотри еще раз на код.
Одна и та же структура, одна и та же платформа, два разных метода добывания размера дают разный результат. Более того, если, например, изменить int b[27]; на int b[3];, или убрать void *a;, все будет правильно работать. Похоже на баг. |
|||
|
||||
| alexvs11 |
|
|||
|
hell is here ![]() ![]() Профиль Группа: Участник Сообщений: 518 Регистрация: 21.8.2010 Репутация: нет Всего: 10 |
0xDEAD, вы все же перечитайте пост Earnest, про выравнивание структур
|
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Интересно было бы посмотреть на выравнивание (относительные адреса) каждого члена... т.е. offsetof
А может это у компилятора по поводу поля нулевого размера особое мнение? "Метод добывания размера" путем взятия адреса "левого" поля как-то сомнительно выглядит. Хотя вроде бы с точки зрения старого доброго С все ok. Может это UB а не баг? -------------------- ... |
|||
|
||||
| alexvs11 |
|
|||
|
hell is here ![]() ![]() Профиль Группа: Участник Сообщений: 518 Регистрация: 21.8.2010 Репутация: нет Всего: 10 |
это строка нарушает стандарт по стандарту можно вычитать указатели только 1) одного типа 2) являющиеся элементами одного массива результатом вычитания будет ptrdiff_t все остальное UB
|
|||
|
||||
| 0xDEAD |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 77 Регистрация: 20.9.2009 Репутация: нет Всего: 3 |
Может и так, но как раз она правильно работает, в отличие от sizeof. Я упростил пример в первом сообщении, используя offsetof:
Результат тот же: под 32 бит выдает ОК, под 64 выдает баг. |
||||
|
|||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 4 Всего: 85 |
0xDEAD, вот это, внимательно читаем. Дело в том что выравнивание по умолчанию структур в 32 и 64 разрядных режимах разные. напишите перед структурой: #pragma pack(1) если проблема повоторится, тогда и будет говорить о баге... |
|||
|
||||
| 0xDEAD |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 77 Регистрация: 20.9.2009 Репутация: нет Всего: 3 |
volatile, внимательно читаем код в первом посте.
При чем тут pragma pack? Я не сравниваю 32 битный размер с 64 битным, а 32 с 32, и 64 с 64, двумя разными методами. В любом случае, я изминил в своем коде sizeof на offsetof, и теперь все работает. |
|||
|
||||
| alexvs11 |
|
|||
|
hell is here ![]() ![]() Профиль Группа: Участник Сообщений: 518 Регистрация: 21.8.2010 Репутация: нет Всего: 10 |
0xDEAD, что все? зачем это?
|
|||
|
||||
| 0xDEAD |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 77 Регистрация: 20.9.2009 Репутация: нет Всего: 3 |
alexvs11, примерно так:
|
|||
|
||||
| alexvs11 |
|
|||
|
hell is here ![]() ![]() Профиль Группа: Участник Сообщений: 518 Регистрация: 21.8.2010 Репутация: нет Всего: 10 |
0xDEAD, а причем первый вопрос? чтото непойму
|
|||
|
||||
| 0xDEAD |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 77 Регистрация: 20.9.2009 Репутация: нет Всего: 3 |
sizeof(STRU) дает не верный результат, по этому "hello" пишется не туда, а printf пичатает мусор.
|
|||
|
||||
| Dem_max |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1780 Регистрация: 12.4.2007 Репутация: 1 Всего: 39 |
и сколько размер sizeof(STRU) из 64 битной программы ?
Логично, потому что пишешь не туда, поэтому и printf пичатает мусор. Бага тут нет. -------------------- Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte") |
||||
|
|||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Visual C++/MFC/WTL | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |