![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| ForceKeeper |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 25 Регистрация: 17.3.2010 Где: Минск Репутация: нет Всего: нет |
Есть класс, в который я не могу залезть ручками, и мне нужно располагать объекты данного класса по адресам, которые определю я сам. Можно ли еще это как-то сделать без глобальной перегрузки new?
|
|||
|
||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
||||
|
||||
| ForceKeeper |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 25 Регистрация: 17.3.2010 Где: Минск Репутация: нет Всего: нет |
Ага, тогда тут по теме еще такой вопрос появился:
Вообще я попробую написать собственный аллокатор и соответственно мне нужно проводить выравнивание. В туторе, который я смотрел, там адреса сразу были записаны в 32-битные ансайты и соответственно оперировали с ними (в частности использовали побитовое *и* для выделения окончания адреса). Так вот я хотел свои void* при помощи intptr_t reinterpret_cast перекинуть в инты, осуществить выравнивание и затем обратно кинуть исправленный адрес в указатель. Но потом мне сказали, что на 64-битных форточках адрес может быть восьмибайтовым, в то время как инт четырехбайтовый. Это так? Если да, то как бороться с этой проблемой? |
|||
|
||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
Вот так должно быть переносимо. По сути ptrdiff_t обязан быть достаточного размера, чтобы хранить разницу двух указателей, нигде не говорится, что второй указатель не может быть null, т.е. ptrdiff_t (результат вычитания двух указателей) должен быть минимум того же размера, что и сам указатель. Я так думаю © Это сообщение отредактировал(а) azesmcar - 17.1.2011, 09:33 |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
||||
|
||||
| azesmcar |
|
||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
а, ну да
пусть будет вот так Это сообщение отредактировал(а) azesmcar - 17.1.2011, 15:19 |
||||
|
|||||
| ForceKeeper |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 25 Регистрация: 17.3.2010 Где: Минск Репутация: нет Всего: нет |
Эм, только что проверил для адреса 0x50341233 с 16-байтовым выравниванием, результат был 0x50341240. То есть как и положено. Для 8-байтового пойнтера 0x0000000050341233 аналогично 0x0000000050341240
|
|||
|
||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
||||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Практически - да. Т.к. size_t описывает тип, в который должен влезть размер любого объекта в памяти, т.е. размерностью не менее размерности адресного пространства. (Однако никто не может запретить поинтеру быть больше, чем размерность адресного пространства - например не использовать часть битов представления поинтеров). Надо бы в стандарте глянуть |
|||
|
||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
||||
|
||||
| baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
строго говоря для безопасного и переносимого хранения указателей следует использовать uintptr_t
хотя в большинстве практических случаев sizeof(size_t)==sizeof(uintptr_t) |
|||
|
||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
||||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |