![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
georain |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 193 Регистрация: 28.11.2006 Где: Санкт-Петербург Репутация: нет Всего: нет |
система linux 2.6, x86_64.
если x меньше 16381 то указатель находится в пределах первого Гб, а вот если больше этого числа указатель получает значение около 1е12. ![]() Откуда берутся такие указатели и можно ли как-нибудь сделать чтобы они всегда в первых 2Гб были? А то у меня есть кусок старого кода, которому такие указатели не нравятся. |
|||
|
||||
Ken |
|
|||
Новичок Профиль Группа: Участник Сообщений: 47 Регистрация: 31.3.2007 Репутация: 2 Всего: 4 |
По идее size_t - не float, поэтому странно что cout печатает такое значение. А если использовать int вместо size_t? По крайней мере у меня в размерах меньше и больше 16кб получилось значение 134520840 (linux26, x86_32, gcc4). Но обычно вас не должно интересовать реальное значение указателья, потому что распределением адресов занимается библиотека. Но при желании вы можете переопределить оператор new и сами выделить память.
Можете показать этот кусочек кода? Это сообщение отредактировал(а) Ken - 29.5.2008, 21:05 |
|||
|
||||
georain |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 193 Регистрация: 28.11.2006 Где: Санкт-Петербург Репутация: нет Всего: нет |
А он и печатает число 218476039485 ![]() Собственно кусочек кода я и привёл, больше и не надо ничего. Тут дело как раз в том что у меня x86_64, а там теоретически указатели до 2^64 могут быть ![]() А у меня код и под 64 и под 32, причём под 32 код уж такой дремучий достался, что переписывать уж больно не хочется. Там 100% 64-х битные указатели в какой-нибудь int32 преобразовывается. Товарищи что делать? помогите! ![]() |
|||
|
||||
UnrealMan |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 722 Регистрация: 30.3.2006 Репутация: 27 Всего: 32 |
Попробуй вывести в cout сам указатель (без преобразования в size_t). Скорее всего, результат будет тот же.
|
|||
|
||||
MAKCim |
|
||||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
в первом случае аллокатором используются страницы, отображенные по адресам из диапазона [адрес .bss + размер .bss, brk(0)) в случае, если этих страниц не хватает (второй случай), аллокатор использует mmap() + MAP_ANONYMOUS для аллокации и отображения новых страниц для x86-64 mmap() поддерживает флаг MAP_32BIT, обеспечивающий отображение в рамках первых 2GB но аллокатор его не использует (т. к это потенциально ограничивает объем физической памяти, который он может запросить у ядра) Добавлено через 2 минуты и 2 секунды
если код для Linux и только, используй mmap() + MAP_32BIT иначе оборачивай макросами -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
||||
|
|||||
georain |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 193 Регистрация: 28.11.2006 Где: Санкт-Петербург Репутация: нет Всего: нет |
Т.е. мне нужно написать свой аллокатор с использованием mmap()...
|
|||
|
||||
MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
если критичны адреса < 2GB можно пропатчить аллокатор из glibc (вызов mmap() заменить на brk()) Это сообщение отредактировал(а) MAKCim - 29.5.2008, 22:34 -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
georain |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 193 Регистрация: 28.11.2006 Где: Санкт-Петербург Репутация: нет Всего: нет |
А это переносимо на машину без пропатченного glibc? offtop. Давно интересовал вопрос: если не использовать виртуальную память, можно ли убрать страничную организацию памяти, чтобы была прямая физическая адресация? По идее это должно убрать издержки на её использование, и например это может пригодится для единственного серверного приложения на машине, типа выделить ему всю память за исключением памяти ядра. Не бейте если что, сумасшедший я ![]() |
|||
|
||||
MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
нет, если будет использоваться динамически загружаемые libc.so, libstdc++.so
для узкоспециализированных задач все можно на то они и узкоспециализированные -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
georain |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 193 Регистрация: 28.11.2006 Где: Санкт-Петербург Репутация: нет Всего: нет |
||||
|
||||
MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
даст, но навряд ли это будет ощутимо -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |