|
05.07.2011, 22:41
|
#1
|
Зануда с интернетом
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений (для 20,935 пользователей)
|
Выделение памяти
Размышления о "метафзике" программирования.
"С++ знает" какой объём памяти выделен по некоему указателю.
Т.е.
char *x=new char[100500];
void *x3_4to_eto=(void*)x;
delete[]x3_4to_eto;
должно работать корректно. Как-то никогда не задумывался: почему тогда пользователю не предоставлен интерфейс "обратной связи" - получения размера куска памяти, на начало которого ссылается указатель?
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
|
(Offline)
|
|
Эти 3 пользователя(ей) сказали Спасибо impersonalis за это полезное сообщение:
|
|
05.07.2011, 23:04
|
#2
|
Дэвелопер
Регистрация: 17.01.2006
Сообщений: 1,512
Написано 78 полезных сообщений (для 110 пользователей)
|
Ответ: Выделение памяти
Осмелюсь предположить, что знает не С++, а операционка. Кусок памяти выделяется при помощи системного вызова, который возвращает указатель либо дескриптор. При помощи другого системного вызова этот же кусок памяти помечается как свободный. Т.о. операционка может никому и не говорить, где и как она хранит размер этого куска памяти.
|
(Offline)
|
|
Эти 3 пользователя(ей) сказали Спасибо alcoSHoLiK за это полезное сообщение:
|
|
05.07.2011, 23:06
|
#3
|
Зануда с интернетом
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений (для 20,935 пользователей)
|
Ответ: Выделение памяти
Очень здравое предположение. Т.е. пользователю-программисту доступен лишь необходимы минимум интерфейса.
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
|
(Offline)
|
|
06.07.2011, 00:31
|
#4
|
☭
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений (для 2,707 пользователей)
|
Ответ: Выделение памяти
я думаю ето потомучто программист начнет считать байты. а операционка то себе заныкала пару. а то и шестнадцать.
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо HolyDel за это полезное сообщение:
|
|
06.07.2011, 02:00
|
#5
|
Дэвелопер
Регистрация: 06.04.2009
Адрес: Запорожье
Сообщений: 1,500
Написано 1,011 полезных сообщений (для 4,642 пользователей)
|
Ответ: Выделение памяти
Зачем знать, сколько байт было отведено под хранение определенных данных? Я имею в виду, с учетом накладных расходов. А чистый объем хранимых данных можно и вручную посчитать.
Еще вот http://habrahabr.ru/company/abbyy/blog/117208/
Может наведет на какие-то мысли.
__________________
|
(Offline)
|
|
Эти 3 пользователя(ей) сказали Спасибо .Squid за это полезное сообщение:
|
|
26.02.2014, 02:03
|
#6
|
Зануда с интернетом
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений (для 20,935 пользователей)
|
Ответ: Выделение памяти
Сообщение от .Squid
Зачем знать, сколько байт было отведено под хранение определенных данных? Я имею в виду, с учетом накладных расходов. А чистый объем хранимых данных можно и вручную посчитать.
Еще вот 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 я так и не написал парсер (в целях самообразования).
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
26.02.2014, 05:01
|
#7
|
|
Ответ: Выделение памяти
а достаточно было просто найти туториал по реализации своего хип аллокатора, ведь malloc\free (и new\delete в итоге) это просто функции описаные в C Runtime Library, которые используют механизм аллокации виртуальных страниц у ядра ОС, можно просто взять и посмотреть исходники CRT например =)
|
|
|
26.02.2014, 11:25
|
#8
|
Дэвелопер
Регистрация: 04.09.2005
Адрес: Красноярск
Сообщений: 1,376
Написано 491 полезных сообщений (для 886 пользователей)
|
Ответ: Выделение памяти
impersonalis, Похоже, опасную игру ты затеял.
|
(Offline)
|
|
14.03.2014, 00:23
|
#9
|
Зануда с интернетом
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений (для 20,935 пользователей)
|
Ответ: Выделение памяти
Так... на всякий случай, может кому интересно:
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
Результаты соответствуют утверждаемому в интернетах.
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 23:34.
|