![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| marcusmae |
|
||||
![]() stravaganza ![]() ![]() Профиль Группа: Участник Сообщений: 874 Регистрация: 26.3.2006 Репутация: 5 Всего: 39 |
Всем привет,
Подкиньте пожалуйста идеек, а то я уже спёкся : есть, например,
В зависимости от текущего pack-а, размер данной структуры может быть различным на компиляторах разной битности, например, если pack(4), то в 32 битах sizeof будет 4, а в 64 битах - 8. Вопрос : какие есть хорошие способы сделать размер структуры (не конкретно этой, а вообще любой, в т.ч. шаблонной) одинаковым на 32 и на 64 битах? Под хорошими понимаю, что не надо вызывать экскаватор, чтобы полностью перелопатить несколько тысяч строк кода. Сюда же, есть, например,
Здесь уже может бытьразличным не только размер, но и относительное смещение полей структуры. Вопрос : как можно сделать одинаковые смещения (паддинг) для 32 и 64-битного представлений? Спасибо. -------------------- ἀπὸ μηχανῆς θεός |
||||
|
|||||
| Mayk |
|
|||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: 45 Всего: 134 |
1) все int'ы, long'и и тд заменить на int32_t, int64_t, т д, определенные в inttypes.h и/или stdint.h 2) Вместо указателей использовать uint64_t, который кастовать к указателю в случае надобности 3) а нафига? про выравнивание не скажу ибо не юзал (см п. 3)) -------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
|||
|
||||
| Любитель |
|
|||
|
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 24 Всего: 92 |
Для бинарной совместимости сохраняемых данных, я думаю |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
А что, указатель полученный по сети является валидным Лично мне тоже не понятно, зачем куда-то сохраняться/пересылать указатели. Если в пределах одного процесса, то нет вообще никаких проблем с бинарной совместимостью. А если между разными, то по любому надо передавать данные, а не указатели на них. |
|||
|
||||
| marcusmae |
|
|||
![]() stravaganza ![]() ![]() Профиль Группа: Участник Сообщений: 874 Регистрация: 26.3.2006 Репутация: 5 Всего: 39 |
Друзья, речь идёт о процессоре Cell, который сидит например в PlayStation3 :
![]() Головной PowerPC имеет 64-битную адресацию, сопроцессоры - сокращённую 32-битную. Если из памяти основного процессора переслать на сопроцессор структуру, содержающую поля-указатели, то на сопроцессоре они перестанут быть валидны, т.к. будут иметь другую длину, а сама структура будет иметь неверный sizeof - всё сломается. Конечно, остаться без решения шансов нет никаких, как раз в этом духе
и предлагается действовать, причём безотносительно специфики кода - представьте сколько времени займут такие преобразования в большой программе. Я намеренно не писал об архитектуре, поскольку цель вопроса именно в поиске языковых возможностей. Что можно сделать для того чтобы в 32-битном представлении указатель располагался в структуре, как 4 байта и затем следовала бы 4-байтовая дырка, а в 64-битном - как полные 8 байтов? В принципе, имея это, уже видно, что делать. Подскажите, пожалуйста. -------------------- ἀπὸ μηχανῆς θεός |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
Если пишется на C++, то можно сварганить шаблон типа:
Кстати, а адресное пространство у процессов выполняющихся на разных ядрах этого процессора одинаковое? Там точно можно просто касты делать? |
|||
|
||||
| marcusmae |
|
||||
![]() stravaganza ![]() ![]() Профиль Группа: Участник Сообщений: 874 Регистрация: 26.3.2006 Репутация: 5 Всего: 39 |
bsa, спасибо, вот я сварганил ещё один вариант :
Под рукой M$VC :
ну и sizeof(ptr) = 8 в обоих случаях, char byte - для массовки Похоже, что результат достигается. А ещё лучше можно? Чтобы вообще минимум изменений в код или макросами и прагмами? Это сообщение отредактировал(а) marcusmae - 8.8.2008, 00:17 -------------------- ἀπὸ μηχανῆς θεός |
||||
|
|||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
вряд ли...
Если пишешь на С++, то можно вместо указателей использовать шаблон "указатель" (который я привел), определив все необходимые методы. Тогда ограничишься правкой только объявлений структур/классов. |
|||
|
||||
| marcusmae |
|
|||
![]() stravaganza ![]() ![]() Профиль Группа: Участник Сообщений: 874 Регистрация: 26.3.2006 Репутация: 5 Всего: 39 |
На сопроцессорах вроде бы одинаковое, но пожалуй это не принципиально. Подход следующий : выделяем локальную память под структуру и перекачиваем туда экземпляр из памяти мастера. В этом экземпляре готовенькие только поля-значения, а поля-указатели ссылаются на адреса в памяти мастера. Необходимо же получить на сопроцессоре полную копию структуры, считая reference-данные. Так что снова выделяем память и перекачиваем данные с этих адресов. Ну и завершающий шаг : теперь, когда ссылочное хозяйство стало локальным, нужно поменять в локальном же экземпляре структуры адреса с мастеровых на локальные. Далее с этой структурой можно работать как ни в чём не бывало Да, пожалуй. -------------------- ἀπὸ μηχανῆς θεός |
|||
|
||||
| marcusmae |
|
|||
![]() stravaganza ![]() ![]() Профиль Группа: Участник Сообщений: 874 Регистрация: 26.3.2006 Репутация: 5 Всего: 39 |
А может быть так :
? -------------------- ἀπὸ μηχανῆς θεός |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
имхо, это сложнее и синтаксис будет менее красивым, нежели с шаблоном...
|
|||
|
||||
| marcusmae |
|
||||||||
![]() stravaganza ![]() ![]() Профиль Группа: Участник Сообщений: 874 Регистрация: 26.3.2006 Репутация: 5 Всего: 39 |
почему сложнее?
даст
а у Вас будет
- составной объект - до указателя нужно ещё добраться. синтаксис конечно выглядит более естественно Это сообщение отредактировал(а) marcusmae - 8.8.2008, 13:42 -------------------- ἀπὸ μηχανῆς θεός |
||||||||
|
|||||||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
вот именно. кроме этого можно повесить кучу проверок и прочего, таким образом компилятор сможет проверить корректность использования. |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |