обьем выделенной памяти
От: __Andrey__  
Дата: 29.11.02 14:22
Оценка:
Каким образом можно узнать выделенный обьем памяти
через оперцию new/
например
char* a = new char[100]
как узнать что указатель
a
показывает на участок в 100 байт
?????????????????
Платформа Windows
Re: обьем выделенной памяти
От: Kaa Украина http://blog.meta.ua/users/kaa/
Дата: 29.11.02 14:25
Оценка:
Здравствуйте, __Andrey__, Вы писали:

A>Каким образом можно узнать выделенный обьем памяти

A>через оперцию new/

Никак. Сохраняй размер при создании динамического блока. По указателю узнать что-бы то ни было нельзя.
Алексей Кирдин
Re: обьем выделенной памяти
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 29.11.02 14:26
Оценка:
Здравствуйте, __Andrey__, Вы писали:

A>Каким образом можно узнать выделенный обьем памяти

A>через оперцию new/
A>например
A>char* a = new char[100]
A>как узнать что указатель
A>a
A>показывает на участок в 100 байт
A>?????????????????
A>Платформа Windows


_msize
Returns the size of a memory block allocated in the heap.

size_t _msize( void *memblock );

Routine Required Header Compatibility 
_msize <malloc.h> Win 95, Win NT 

Return Value

_msize returns the size (in bytes) as an unsigned integer.
Re[2]: обьем выделенной памяти
От: __Andrey__  
Дата: 29.11.02 14:28
Оценка:
Мне кажется что msize
работает в том случае если
память выделена через malloc
или я не прав ?
Re[2]: обьем выделенной памяти
От: __Andrey__  
Дата: 29.11.02 14:31
Оценка:
Или даже давайте смотреть глубже :
указатель на денамически выделенный массив указателей.
Как узнать не просто размер , а количество елементов массива ?
Т.е. delete [] знает сколько нужно удалять
и а я хочу знать чего там лежит.
Re[3]: обьем выделенной памяти
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 29.11.02 14:33
Оценка:
Здравствуйте, __Andrey__, Вы писали:

A>Мне кажется что msize

A>работает в том случае если
A>память выделена через malloc
A>или я не прав ?

new тоже, можешь попробовать, да он по-моему внутри себя тот же malloc и вызывает.
Re[2]: обьем выделенной памяти
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 29.11.02 14:34
Оценка:
Здравствуйте, Kaa, Вы писали:

A>>Каким образом можно узнать выделенный обьем памяти

A>>через оперцию new/

Kaa>Никак. Сохраняй размер при создании динамического блока. По указателю узнать что-бы то ни было нельзя.


я уже зарекся вот так сходу отвечать "Никак", "Нельзя", даже если точно знаю что никак и нельзя
Re[4]: обьем выделенной памяти
От: __Andrey__  
Дата: 29.11.02 14:35
Оценка:
Здравствуйте, Odi$$ey, Вы писали:

O$>Здравствуйте, __Andrey__, Вы писали:

A>>Мне кажется что msize

A>>работает в том случае если
A>>память выделена через malloc
A>>или я не прав ?

O$>new тоже, можешь попробовать, да он по-моему внутри себя тот же malloc и вызывает.
Да вы правы new тоже в "heap" размещает
Re[3]: обьем выделенной памяти
От: Kaa Украина http://blog.meta.ua/users/kaa/
Дата: 29.11.02 14:36
Оценка:
Здравствуйте, __Andrey__, Вы писали:

A>msize работает, если память выделена через malloc

A>или я не прав ?

Прав. Odi$$ey упускает, что оператор new может быть перекрыт глобально для, например, алтернативного выделения памяти, для отказа от CRT. Например, звать функцию операционной системы, либо использовать указатель из пула объектов, если реализован custom-распределитель памяти.
Алексей Кирдин
Re[3]: обьем выделенной памяти
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 29.11.02 14:38
Оценка:
Здравствуйте, __Andrey__, Вы писали:

A>Или даже давайте смотреть глубже :

A>указатель на денамически выделенный массив указателей.
A>Как узнать не просто размер , а количество елементов массива ?

ну так раздели то что дает msize на sizeof одного указателя

A>Т.е. delete [] знает сколько нужно удалять

A>и а я хочу знать чего там лежит.

никакое delete[] не удалит память выделенную по каждому указателю в массиве указателей, все равно сам должен будешь обойти и каждому персонально сделать delete
Re[3]: обьем выделенной памяти
От: Kaa Украина http://blog.meta.ua/users/kaa/
Дата: 29.11.02 14:43
Оценка:
Здравствуйте, Odi$$ey, Вы писали:

O$> я уже зарекся вот так сходу отвечать "Никак", "Нельзя", даже если точно знаю что никак и нельзя

Возможно, речь идет о конкретной реализации по умолчанию в конкретной CRT.
Собрав свою программу с libctiny, ты получишь альтернативную реализацию operator new/delete (да и malloc/freeбез использования CRT), и, соответственно, говорить, что в любой проге, использующей new, в итоге вызывается malloс, не верно в корне. Спроси у Влада. У них проекты без использования CRT вообще, а new они наверняка широко пользуют.

Короче, дело еще и в окружении.
Алексей Кирдин
Re[4]: обьем выделенной памяти
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 29.11.02 14:48
Оценка:
Здравствуйте, Kaa, Вы писали:

Kaa>Возможно, речь идет о конкретной реализации по умолчанию в конкретной CRT.

Kaa>Собрав свою программу с libctiny, ты получишь альтернативную реализацию operator new/delete (да и malloc/freeбез использования CRT), и, соответственно, говорить, что в любой проге, использующей new, в итоге вызывается malloс, не верно в корне. Спроси у Влада. У них проекты без использования CRT вообще, а new они наверняка широко пользуют.

Kaa>Короче, дело еще и в окружении.


согласен, но "никак" — это все равно неправильно
Re[4]: обьем выделенной памяти
От: Kaa Украина http://blog.meta.ua/users/kaa/
Дата: 29.11.02 14:48
Оценка:
Здравствуйте, Odi$$ey, Вы писали:

O$>ну так раздели то что дает msize на sizeof одного указателя
Эти грабли уже практически попали в QA. "Тольк бледнолицый..." malloc в релизе выделяет память блоками с выравниванием на 16 байт (ну, или типа того). Таким образом, написав:
void* p = malloc( 2 );
unsigned sz = _msize( p );


мы получим немного не то, что хотели бы (при обычном окружении в VC60)
Алексей Кирдин
Re[5]: обьем выделенной памяти
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 29.11.02 14:56
Оценка:
Здравствуйте, Kaa, Вы писали:

Kaa>Здравствуйте, Odi$$ey, Вы писали:


O$>>ну так раздели то что дает msize на sizeof одного указателя
Kaa>Эти грабли уже практически попали в QA. "Тольк бледнолицый..." malloc в релизе выделяет память блоками с выравниванием на 16 байт (ну, или типа того). Таким образом, написав:
Kaa>
Kaa>void* p = malloc( 2 );
Kaa>unsigned sz = _msize( p );
Kaa>


Kaa>мы получим немного не то, что хотели бы (при обычном окружении в VC60)


попробовал, менял в настройках проекта выравнивание от 1 до 16 байт, результат всегда sz==2;
Re[6]: обьем выделенной памяти
От: Kaa Украина http://blog.meta.ua/users/kaa/
Дата: 29.11.02 15:04
Оценка:
Здравствуйте, Odi$$ey, Вы писали:

O$>результат всегда sz==2;
Всегда ли? release/debag, single/multithreaded, static/dynamic (всего 6 вариантов).

http://www.rsdn.ru/Forum/?mid=73035
Автор: Андрей Тарасевич
Дата: 15.07.02
и ниже по ветке.
Алексей Кирдин
Re[6]: обьем выделенной памяти
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 29.11.02 15:05
Оценка:
Здравствуйте, Odi$$ey, Вы писали:

Kaa>>мы получим немного не то, что хотели бы (при обычном окружении в VC60)


O$>попробовал, менял в настройках проекта выравнивание от 1 до 16 байт, результат всегда sz==2;

стоп, это я пробовал в VС7, в VC6 действительно получается 16
Re[5]: обьем выделенной памяти
От: __Andrey__  
Дата: 29.11.02 15:06
Оценка:
Kaa>мы получим немного не то, что хотели бы (при обычном окружении в VC60)

Дело не втом что он выделяет минимум 16 байт
а в том что мы сможем использовать все равно столько сколько запросили
и _msize вернет именно 2
По крайней мере у меня так работает при нормальном окружении.
Re[6]: обьем выделенной памяти
От: Kaa Украина http://blog.meta.ua/users/kaa/
Дата: 29.11.02 15:09
Оценка:
Здравствуйте, __Andrey__, Вы писали:

Kaa>>мы получим немного не то, что хотели бы (при обычном окружении в VC60)


A>По крайней мере у меня так работает при нормальном окружении.


#include <stdio.h>
#include <malloc.h>

int main()
{
  void *    p   = malloc( 2 );
  unsigned  sz  = _msize( p );

  printf( "Size == %u\n", sz );

  return 0;
}


Скомпили в релизе (во всех трех вариантах релиза). Не поленись.
Алексей Кирдин
Re[7]: обьем выделенной памяти
От: __Andrey__  
Дата: 29.11.02 15:19
Оценка:
Интересно как быть если я расчитываю
на детализацию до байта.
Re[8]: обьем выделенной памяти
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 29.11.02 15:22
Оценка:
Здравствуйте, __Andrey__, Вы писали:

A>Интересно как быть если я расчитываю

A>на детализацию до байта.

пользуй VC7
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.