forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   C++ (http://forum.boolean.name/forumdisplay.php?f=22)
-   -   Выделение памяти (http://forum.boolean.name/showthread.php?t=15069)

impersonalis 05.07.2011 22:41

Выделение памяти
 
Размышления о "метафзике" программирования.
"С++ знает" какой объём памяти выделен по некоему указателю.
Т.е.
Код:

char *x=new char[100500];
void *x3_4to_eto=(void*)x;
delete[]x3_4to_eto;

должно работать корректно. Как-то никогда не задумывался: почему тогда пользователю не предоставлен интерфейс "обратной связи" - получения размера куска памяти, на начало которого ссылается указатель?

alcoSHoLiK 05.07.2011 23:04

Ответ: Выделение памяти
 
Осмелюсь предположить, что знает не С++, а операционка. Кусок памяти выделяется при помощи системного вызова, который возвращает указатель либо дескриптор. При помощи другого системного вызова этот же кусок памяти помечается как свободный. Т.о. операционка может никому и не говорить, где и как она хранит размер этого куска памяти.

impersonalis 05.07.2011 23:06

Ответ: Выделение памяти
 
Очень здравое предположение. Т.е. пользователю-программисту доступен лишь необходимы минимум интерфейса.

HolyDel 06.07.2011 00:31

Ответ: Выделение памяти
 
я думаю ето потомучто программист начнет считать байты. а операционка то себе заныкала пару. а то и шестнадцать.

.Squid 06.07.2011 02:00

Ответ: Выделение памяти
 
Зачем знать, сколько байт было отведено под хранение определенных данных? Я имею в виду, с учетом накладных расходов. А чистый объем хранимых данных можно и вручную посчитать.
Еще вот http://habrahabr.ru/company/abbyy/blog/117208/
Может наведет на какие-то мысли.

impersonalis 26.02.2014 02:03

Ответ: Выделение памяти
 
Цитата:

Сообщение от .Squid (Сообщение 194523)
Зачем знать, сколько байт было отведено под хранение определенных данных? Я имею в виду, с учетом накладных расходов. А чистый объем хранимых данных можно и вручную посчитать.
Еще вот http://habrahabr.ru/company/abbyy/blog/117208/
Может наведет на какие-то мысли.

Странно - как я тогда проглядел этот пост?

Вот ещё:
http://www.hardforum.ru/t72258/#post497092
Код:

long *asdf;
 asdf=(long*)malloc(1000);

 asdf[-4] - указывает на размер текущего массива в байтах (в Debug -моде, в релизе может быть по другому)
 asdf[-8] - адрес предыдущего массива
 asdf[-2]
 asdf[-3] - тоже что-то значат


http://forum.codenet.ru/q72668/Что+з...+массивом% 3F
Код:

int *ptr_int = new int[10];

for (int i=-4; i<=-1; i++)
    cout << *(ptr_int + i) << " ";
 Вывод: 40 1 333 -33686019

 40 - это размер массива в байтах в Windows.


http://www.linux.org.ru/forum/development/2849473
Цитата:

менеджер памяти хранит служебную информацию о блоках памяти обычно в служебном мини-блоке, перед самим блоком, обычно это 16 байт (на 32х битных машинах), содержащие размер распределенного блока памяти, а так-же указатели на кучу, и на следующий/предыдущий элементы. Таким образом, при вызове free(ptr), функция free вычисляет смещение ptr-16 байт, и по этому адресу пытается найти служебную информацию, относящуюся к распределению памяти в куче.

http://hashcode.ru/questions/95558/о...массивами-от-c
Код:

//for(int i=0;i<sz;i++); нет, это не наш метод, обойдемся без sz
        for(int i=0;i<*(((int*)pa)-1);i++);//совсем другое дело

Вывод: информация хранится в блоке перед выделенной пользователю памятью. Система хранения зависит от "всего" (не фиксируется стандартом языка, что логично), поэтому привязывать к такому решению код - грязнющий хак.
Для своей версии MinGW я так и не написал парсер (в целях самообразования).

jimon 26.02.2014 05:01

Ответ: Выделение памяти
 
а достаточно было просто найти туториал по реализации своего хип аллокатора, ведь malloc\free (и new\delete в итоге) это просто функции описаные в C Runtime Library, которые используют механизм аллокации виртуальных страниц у ядра ОС, можно просто взять и посмотреть исходники CRT например =)

Жека 26.02.2014 11:25

Ответ: Выделение памяти
 
impersonalis, Похоже, опасную игру ты затеял.

impersonalis 14.03.2014 00:23

Ответ: Выделение памяти
 
Так... на всякий случай, может кому интересно:
Hamaus протестировал код (и производные)
Код:

long *asdf;
asdf=(long*)malloc(1000);
...

из поста №6
на Microsoft Visual Studio 2008
Version 9.0.30729.1 SP
Microsoft .NET Framework
Version 3.5 SP1
Результаты соответствуют утверждаемому в интернетах.


Часовой пояс GMT +4, время: 01:33.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot