| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Структуры в 32-битной и 64-битной адресации |
| Автор: marcusmae 7.8.2008, 18:10 | ||||
| Всем привет, Подкиньте пожалуйста идеек, а то я уже спёкся : есть, например,
В зависимости от текущего pack-а, размер данной структуры может быть различным на компиляторах разной битности, например, если pack(4), то в 32 битах sizeof будет 4, а в 64 битах - 8. Вопрос : какие есть хорошие способы сделать размер структуры (не конкретно этой, а вообще любой, в т.ч. шаблонной) одинаковым на 32 и на 64 битах? Под хорошими понимаю, что не надо вызывать экскаватор, чтобы полностью перелопатить несколько тысяч строк кода. Сюда же, есть, например,
Здесь уже может бытьразличным не только размер, но и относительное смещение полей структуры. Вопрос : как можно сделать одинаковые смещения (паддинг) для 32 и 64-битного представлений? Спасибо. |
| Автор: Любитель 7.8.2008, 19:20 |
Для бинарной совместимости сохраняемых данных, я думаю |
| Автор: bsa 7.8.2008, 21:58 | ||
А что, указатель полученный по сети является валидным Лично мне тоже не понятно, зачем куда-то сохраняться/пересылать указатели. Если в пределах одного процесса, то нет вообще никаких проблем с бинарной совместимостью. А если между разными, то по любому надо передавать данные, а не указатели на них. |
| Автор: marcusmae 7.8.2008, 22:36 | ||
Друзья, речь идёт о процессоре Cell, который сидит например в PlayStation3 :![]() Головной PowerPC имеет 64-битную адресацию, сопроцессоры - сокращённую 32-битную. Если из памяти основного процессора переслать на сопроцессор структуру, содержающую поля-указатели, то на сопроцессоре они перестанут быть валидны, т.к. будут иметь другую длину, а сама структура будет иметь неверный sizeof - всё сломается. Конечно, остаться без решения шансов нет никаких, как раз в этом духе
и предлагается действовать, причём безотносительно специфики кода - представьте сколько времени займут такие преобразования в большой программе. Я намеренно не писал об архитектуре, поскольку цель вопроса именно в поиске языковых возможностей. Что можно сделать для того чтобы в 32-битном представлении указатель располагался в структуре, как 4 байта и затем следовала бы 4-байтовая дырка, а в 64-битном - как полные 8 байтов? В принципе, имея это, уже видно, что делать. Подскажите, пожалуйста. |
| Автор: bsa 7.8.2008, 23:43 | ||
Если пишется на C++, то можно сварганить шаблон типа:
Кстати, а адресное пространство у процессов выполняющихся на разных ядрах этого процессора одинаковое? Там точно можно просто касты делать? |
| Автор: marcusmae 8.8.2008, 00:14 | ||||
bsa, спасибо, вот я сварганил ещё один вариант :
Под рукой M$VC :
ну и sizeof(ptr) = 8 в обоих случаях, char byte - для массовки Похоже, что результат достигается. А ещё лучше можно? Чтобы вообще минимум изменений в код или макросами и прагмами? |
| Автор: bsa 8.8.2008, 00:21 |
| вряд ли... Если пишешь на С++, то можно вместо указателей использовать шаблон "указатель" (который я привел), определив все необходимые методы. Тогда ограничишься правкой только объявлений структур/классов. |
| Автор: marcusmae 8.8.2008, 00:30 | ||||
На сопроцессорах вроде бы одинаковое, но пожалуй это не принципиально. Подход следующий : выделяем локальную память под структуру и перекачиваем туда экземпляр из памяти мастера. В этом экземпляре готовенькие только поля-значения, а поля-указатели ссылаются на адреса в памяти мастера. Необходимо же получить на сопроцессоре полную копию структуры, считая reference-данные. Так что снова выделяем память и перекачиваем данные с этих адресов. Ну и завершающий шаг : теперь, когда ссылочное хозяйство стало локальным, нужно поменять в локальном же экземпляре структуры адреса с мастеровых на локальные. Далее с этой структурой можно работать как ни в чём не бывало
Да, пожалуй. |
| Автор: marcusmae 8.8.2008, 11:36 | ||
А может быть так :
? |
| Автор: bsa 8.8.2008, 13:21 |
| имхо, это сложнее и синтаксис будет менее красивым, нежели с шаблоном... |
| Автор: marcusmae 8.8.2008, 13:41 | ||||||||
почему сложнее?
даст
а у Вас будет
- составной объект - до указателя нужно ещё добраться. синтаксис конечно выглядит более естественно |
| Автор: bsa 8.8.2008, 17:17 | ||
вот именно. кроме этого можно повесить кучу проверок и прочего, таким образом компилятор сможет проверить корректность использования. |