Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > C++

Ответ
 
Опции темы
Старый 05.07.2011, 22:41   #1
impersonalis
Зануда с интернетом
 
Аватар для impersonalis
 
Регистрация: 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 за это полезное сообщение:
ABTOMAT (06.07.2011), Mr_F_ (05.07.2011), Reizel (06.07.2011)
Старый 05.07.2011, 23:04   #2
alcoSHoLiK
Дэвелопер
 
Регистрация: 17.01.2006
Сообщений: 1,512
Написано 78 полезных сообщений
(для 110 пользователей)
Ответ: Выделение памяти

Осмелюсь предположить, что знает не С++, а операционка. Кусок памяти выделяется при помощи системного вызова, который возвращает указатель либо дескриптор. При помощи другого системного вызова этот же кусок памяти помечается как свободный. Т.о. операционка может никому и не говорить, где и как она хранит размер этого куска памяти.
(Offline)
 
Ответить с цитированием
Эти 3 пользователя(ей) сказали Спасибо alcoSHoLiK за это полезное сообщение:
ABTOMAT (06.07.2011), impersonalis (05.07.2011), Reizel (06.07.2011)
Старый 05.07.2011, 23:06   #3
impersonalis
Зануда с интернетом
 
Аватар для impersonalis
 
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений
(для 20,935 пользователей)
Ответ: Выделение памяти

Очень здравое предположение. Т.е. пользователю-программисту доступен лишь необходимы минимум интерфейса.
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
(Offline)
 
Ответить с цитированием
Старый 06.07.2011, 00:31   #4
HolyDel
 
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений
(для 2,707 пользователей)
Ответ: Выделение памяти

я думаю ето потомучто программист начнет считать байты. а операционка то себе заныкала пару. а то и шестнадцать.
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо HolyDel за это полезное сообщение:
ABTOMAT (06.07.2011), impersonalis (06.07.2011)
Старый 06.07.2011, 02:00   #5
.Squid
Дэвелопер
 
Аватар для .Squid
 
Регистрация: 06.04.2009
Адрес: Запорожье
Сообщений: 1,500
Написано 1,011 полезных сообщений
(для 4,642 пользователей)
Ответ: Выделение памяти

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

(Offline)
 
Ответить с цитированием
Эти 3 пользователя(ей) сказали Спасибо .Squid за это полезное сообщение:
HolyDel (06.07.2011), impersonalis (26.02.2014), Mr_F_ (06.07.2011)
Старый 26.02.2014, 02:03   #6
impersonalis
Зануда с интернетом
 
Аватар для impersonalis
 
Регистрация: 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)
Старый 26.02.2014, 05:01   #7
jimon
 
Сообщений: n/a
Ответ: Выделение памяти

а достаточно было просто найти туториал по реализации своего хип аллокатора, ведь 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
impersonalis
Зануда с интернетом
 
Аватар для impersonalis
 
Регистрация: 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)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


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


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com