Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: размер блока памяти, выделенного из кучи  (Прочитано 18658 раз)
0 Пользователей и 2 Гостей смотрят эту тему.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« : 01-06-2008 05:51 » 

заинтерисовался вот чем. К примеру, есть память, выдененная через new

BYTE* p=new BYTE[100];

нельзя ли, не зная числа 100 как-то узнать длину блока в байтах ? Система же откуда то знает
Записан

McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #1 : 01-06-2008 07:55 » 

Алексей1153++, размер BYTE?
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #2 : 01-06-2008 08:05 » 

McZim, размер блока памяти p[?]
Записан

McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #3 : 01-06-2008 08:18 » 

Алексей1153++, наверное ошибаюсь, но р указатель на блок памяти размером BYTE.

З.Ы.: пойду учить мат часть Улыбаюсь
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #4 : 01-06-2008 08:26 » 

Вот нашел в нете...
Цитата
Оператор new очень удобен - он не требует указания размера блока, который нужно выделить. Размер определяется компилятором автоматически исходя из типа, который указывается после ключевого слова new. Кроме вызова самой функции выделения памяти происходит еще и вызов конструктора объекта, если указан объектный тип
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #5 : 01-06-2008 08:29 » 

Алексей1153++, может все таки лучше malloc, там ты указываешь какой размер тебе необходим.
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #6 : 01-06-2008 08:49 » 

McZim, вопрос совсем о другом!
Есть указатель на блок динамической памяти. Нужно узнать: сколько байт в этом блоке.

Леш, штатных методов нет.
Другой вопрос, что если затачиваться под определенную версию run-time библиотеки, то можно тупым просмотром в дебагере найти поле в блоке, предшествующем указанному, хранящее размер. MSVC, если не ошибаюсь, именно там хранит информацию о блоке.
« Последнее редактирование: 01-06-2008 08:53 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #7 : 01-06-2008 08:59 » 

McZim, ты вопрос не понял Улыбаюсь

меня не интерисует размер BYTE и вообще какой либо размер типа, хочь там будет

MyStruct* p=new MyStruct[100];

malloc тоже ни при чём , зная размер типа и количество выделенных элементов я всегда найду размер блока в байтах:

sizeof(*p)*100

Вопрос вот в чём: к примеру, известно, что "void* pv" - это указатель на память, выделенную из кучи (неважно, что там).
Так вот, зная только указатель - можно ли где то в системе вырыть информацию о блоке памяти - размер блока ?
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #8 : 01-06-2008 09:00 » new

Ром, дебаг идёт лесом Улыбаюсь Программа, скажем, в релизе бегает
Записан

RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #9 : 01-06-2008 09:19 » 

Леш, ксати, ты не можешь в ф-ии ввести ограничение, чтобы передаваемый указатель указывал в динамически выделенную область, а не в автоматически или статически выделенную. Потому подобные ф-ии обычно принимают еще и параметр длины.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
zubr
Гость
« Ответ #10 : 01-06-2008 09:20 » 

Алексей1153++, смотри в сторону Heap-функций: HeapCreate, HeapAlloc, HeapSize
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #11 : 01-06-2008 09:27 » 

zubr,

в HeapSize:
SIZE_T HeapSize(
  HANDLE hHeap,
  DWORD dwFlags,
  LPCVOID lpMem
);

hHeap  - Handle to the heap in which the memory block resides. This handle is returned by either the HeapCreate or GetProcessHeap function.

а хендл мне откуда взять, если использовано было new ?
Записан

zubr
Гость
« Ответ #12 : 01-06-2008 09:30 » 

Ну так используй апишные функции для своей задачи, раз такая необходимость появилась.
Записан
McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #13 : 01-06-2008 09:54 » 

а как быть если не Windows?
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #14 : 01-06-2008 09:55 » 

zubr, слава Богу, необходимость не появилась Улыбаюсь Это просто любопытство
Записан

marat_
Шеф-повар
Опытный

ru
Offline Offline

« Ответ #15 : 01-06-2008 20:58 » 

значит, всё-таки никак не узнать?
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #16 : 01-06-2008 21:15 » 

zubr, Это для работы с кучей, а не с операторами выделения памяти в С++. Когда запускается приложение, также иницилизируется менеджер памяти. Который запрашивает у винды кучу и там уже будет размешаться та память, которая востребуется оператором new. Насколько я знаю, штатных средств для этого не сушествует. Да вроде в стандарте не прописаны структуры менеджера памяти, так что все решения скорее всего будут очень сильно компиляторо зависимые.
Скорее всего, исходили из того, что программист, писавший программу должен сам изначально знать, сколько он выделил памяти.
« Последнее редактирование: 01-06-2008 21:18 от Finch » Записан

Не будите спашяго дракона.
             Джаффар (Коша)
zubr
Гость
« Ответ #17 : 02-06-2008 04:06 » 

Finch, ну это понятно, что в "чистом" C размер блока памяти знает только программист, инициализируя переменную. Но ведь в части вопроса был текст:
Цитата
Система же откуда то знает
Вот от менеджера памяти (в винде) она и знает.
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #18 : 02-06-2008 13:13 » 

zubr, Мы наверно говорим чуть чуть о разном. Менеджер памяти винды и менеджер памяти самой программы, в моем понимании это разные веши и решают разные вопросы. И это не зависит от языка программирования.  В Linux я так далеко не копал, но так понял, что все управление памятью производится через одну библиотеку libc. По крайней мере я пока не встречал понятий кучи или чего нибудь подобного.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
npak
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #19 : 04-06-2008 15:10 » 

Вообще говоря, код run-time для MS VC открыт - можно посмотреть непосредственно в исходниках.

В MS VC 6 рантайм сам управляет своей памятью. Библиотека языка С держит аллоцированную кучу, в которой хранится список аллоцированных блоков + свободная память. В этой опитимизации важно то, что эта память уже захвачена у операционной системы, и, следовательно, операции new/delete и malloc/free сравнительно дешевы и не увеличивают размер виртуальной памяти процесса. Разумеется, когда новый блок невозможно уместить в свободное пространство кучи, аллоцируется дополнительная память, но разбиение на блоки находится под управлением рантайма. Размер блока равен размеру запроса + 4 байта (8 байт на Win64).

В MS VC 2005 рантайм не заботится управлением блоками внутри кучи - всякий запрос на аллокацию памяти перенаправляется в вызов HeapAlloc виндового интерфейса Win32. Я провел эксперимент. Оказалось, что вызов new char[100] не изменил размер виртуальной памяти процесса. Возможно, что оптимизация по размеру блока переместилась из malloc в HeapAlloc.
Записан

UniTesK -- индустриальная технология надежного тестирования.

http://www.unitesk.com/ru/
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines