Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Странности получения динамической памяти 
V
    Опции темы
georain
Дата 29.5.2008, 01:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 193
Регистрация: 28.11.2006
Где: Санкт-Петербург

Репутация: нет
Всего: нет



система linux 2.6, x86_64.

Код

    long * i = new long[x];
    cout << reinterpret_cast<size_t>(i) << endl;


если x меньше 16381 то указатель находится в пределах первого Гб, а вот если больше этого числа указатель получает значение около 1е12. smile

Откуда берутся такие указатели и можно ли как-нибудь сделать чтобы они всегда в первых 2Гб были? А то у меня есть кусок старого кода, которому такие указатели не нравятся.
PM MAIL   Вверх
Ken
Дата 29.5.2008, 21:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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
PM MAIL   Вверх
georain
Дата 29.5.2008, 21:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 193
Регистрация: 28.11.2006
Где: Санкт-Петербург

Репутация: нет
Всего: нет



Цитата(Ken @  29.5.2008,  21:00 Найти цитируемый пост)
По идее size_t - не float, поэтому странно что cout печатает такое значение. 

А он и печатает число 218476039485 smile

Цитата(Ken @  29.5.2008,  21:00 Найти цитируемый пост)
Можете показать этот кусочек кода?

Собственно кусочек кода я и привёл, больше и не надо ничего.

Тут дело как раз в том что у меня x86_64, а там теоретически указатели до 2^64 могут быть smile
А у меня код и под 64 и под 32, причём под 32 код уж такой дремучий достался, что переписывать уж больно не хочется. Там 100% 64-х битные указатели в какой-нибудь int32 преобразовывается.

Товарищи что делать? помогите! smile
PM MAIL   Вверх
UnrealMan
Дата 29.5.2008, 21:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



Попробуй вывести в cout сам указатель (без преобразования в size_t). Скорее всего, результат будет тот же.
PM MAIL   Вверх
MAKCim
Дата 29.5.2008, 22:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата(georain @  29.5.2008,  01:41 Найти цитируемый пост)
если x меньше 16381 то указатель находится в пределах первого Гб, а вот если больше этого числа указатель получает значение около 1е12.

в первом случае аллокатором используются страницы, отображенные по адресам из диапазона [адрес .bss + размер .bss, brk(0))
в случае, если этих страниц не хватает (второй случай), аллокатор использует mmap() + MAP_ANONYMOUS для аллокации и отображения новых страниц
для x86-64 mmap() поддерживает флаг MAP_32BIT, обеспечивающий отображение в рамках первых 2GB
но аллокатор его не использует (т. к это потенциально ограничивает объем физической памяти, который он может запросить у ядра)

Добавлено через 2 минуты и 2 секунды
Цитата(georain @  29.5.2008,  01:41 Найти цитируемый пост)
А то у меня есть кусок старого кода, которому такие указатели не нравятся. 

если код для Linux и только, используй mmap() + MAP_32BIT
иначе оборачивай макросами


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
georain
Дата 29.5.2008, 22:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 193
Регистрация: 28.11.2006
Где: Санкт-Петербург

Репутация: нет
Всего: нет



Т.е. мне нужно написать свой аллокатор с использованием mmap()...
PM MAIL   Вверх
MAKCim
Дата 29.5.2008, 22:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата(georain @  29.5.2008,  22:30 Найти цитируемый пост)
Т.е. мне нужно написать свой аллокатор с использованием mmap()... 

если критичны адреса < 2GB

можно пропатчить аллокатор из glibc (вызов mmap() заменить на brk())

Это сообщение отредактировал(а) MAKCim - 29.5.2008, 22:34


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
georain
Дата 29.5.2008, 22:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 193
Регистрация: 28.11.2006
Где: Санкт-Петербург

Репутация: нет
Всего: нет



Цитата(MAKCim @  29.5.2008,  22:33 Найти цитируемый пост)
можно пропатчить аллокатор из glibc 

А это переносимо на машину без пропатченного glibc?

offtop.
Давно интересовал вопрос: если не использовать виртуальную память, можно ли убрать страничную организацию памяти, чтобы была прямая физическая адресация? По идее это должно убрать издержки на её использование, и например это может пригодится для единственного серверного приложения на машине, типа выделить ему всю память за исключением памяти ядра. Не бейте если что, сумасшедший я smile
PM MAIL   Вверх
MAKCim
Дата 29.5.2008, 22:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата(georain @  29.5.2008,  22:41 Найти цитируемый пост)
А это переносимо на машину без пропатченного glibc?

нет, если будет использоваться динамически загружаемые libc.so, libstdc++.so

Цитата(georain @  29.5.2008,  22:41 Найти цитируемый пост)
Давно интересовал вопрос: если не использовать виртуальную память, можно ли убрать страничную организацию памяти, чтобы была прямая физическая адресация?

для узкоспециализированных задач все можно
на то они и узкоспециализированные


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
georain
Дата 29.5.2008, 22:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 193
Регистрация: 28.11.2006
Где: Санкт-Петербург

Репутация: нет
Всего: нет



Цитата(MAKCim @  29.5.2008,  22:49 Найти цитируемый пост)
для узкоспециализированных задач все можно

MAKCim, как вы считаете, это даст хоть какой-то минимальный прирост при обращении к памяти? Вроде даже есть процессорная команда, сложить два числа и константу, специально для этих операций.
PM MAIL   Вверх
MAKCim
Дата 30.5.2008, 15:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата(georain @  29.5.2008,  22:55 Найти цитируемый пост)
как вы считаете, это даст хоть какой-то минимальный прирост при обращении к памяти?

даст, но навряд ли это будет ощутимо


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0879 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.