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

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

ru
Offline Offline

« Ответ #30 : 19-05-2008 08:44 » 

Не.... Вы зря так накинулись на Finch. Все правильно. Если обе функции резервируют из одной кучи - то все будет хорошо, какие бы дополнительные действия не делали new/delete. За это ответит менеджер памяти системы. Если из разных - привет утечки, плюс, возможно, всякие там int 3 и исключения...
Записан

while (8==8)
Джон
просто
Администратор

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

« Ответ #31 : 19-05-2008 09:20 » 

lapulya, Я всё пытался понять причину, теперь вроде прояснилось. ИМХО ты перечитал книжек и сам себя запугал. Ага Те ты хочешь сказать, что если я в дебаггерной версии проверю sizeof(int), то получу 6,8 или даже 10 байт? Ага

Дебаггер действительно резервирует больше памяти, не за счёт структур языка. Так что твой аргумент бездоказателен.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Finch
Спокойный
Администратор

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


« Ответ #32 : 19-05-2008 11:43 » 

LogRus, Именно со стрингом я не игрался в свое время, но свои собственные классы раскрывал в Dll т потом передавал в управление в основной модуль. Все работало как часы. Самое главное условие было, чтобы все модули компилировались при одинаковых условиях. Если Debug версия, то все должно быть Debug. Надо точно посмотреть в стандарт, но насколько я знаю в релиз версии delete не должен вызывать никаких прерываний и исключений, если дать ему на удаление неправильный адрес.
« Последнее редактирование: 19-05-2008 11:46 от Finch » Записан

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

ru
Offline Offline

« Ответ #33 : 19-05-2008 11:55 » 

Джон и sss ))))) new зарезервирует ровно столько памяти сколько Я скажу (ХОТЬ МЕГАБАЙТ), а вот из них доступно пользувателю будет ровно sizeof(int), чуешь чем паХнет...
« Последнее редактирование: 19-05-2008 11:57 от lapulya » Записан

С уважением Lapulya
Finch
Спокойный
Администратор

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


« Ответ #34 : 19-05-2008 11:56 » 

lapulya, Вот с этого места поподробнее пожайлуста.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #35 : 19-05-2008 11:58 » 

lapulya, вывод : если ты переписываешь new и delete , делай это так, чтобы не сказалось ни на чём, кроме класса, для которого ты это делаешь Улыбаюсь И не надо будет таких проблем искать, как ты ищешь
Записан

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

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


« Ответ #36 : 19-05-2008 11:59 » 

Джон и sss ))))) new зарезервирует ровно столько памяти сколько Я скажу (ХОТЬ МЕГАБАЙТ), а вот из них доступно пользувателю будет ровно sizeof(int), чуешь чем паХнет...
а у меня всегда было доступно ровно, сколько я попросил, ни больше ни меньше Улыбаюсь
Записан

lapulya
Молодой специалист

ru
Offline Offline

« Ответ #37 : 19-05-2008 12:04 » 

Я ща немного пьян ))) рассуждать могу ))) так вот пример из MSDN не совсем корректно поскольку переопределен оператор new для класса но дело не в этом а в подходе

Код:
// spec1_the_operator_new_function1.cpp
#include <malloc.h>
#include <memory.h>

class Blanks
{
public:
    Blanks(){}
    void *operator new( size_t stAllocateBlock, char chInit );
};
void *Blanks::operator new( size_t stAllocateBlock, char chInit )
{
    void *pvTemp = malloc( stAllocateBlock );
    if( pvTemp != 0 )
        memset( pvTemp, chInit, stAllocateBlock );
    return pvTemp;
}
// For discrete objects of type Blanks, the global operator new function
// is hidden. Therefore, the following code allocates an object of type
// Blanks and initializes it to 0xa5
int main()
{
   Blanks *a5 = new(0xa5) Blanks;
   return a5 != 0;
}
Записан

С уважением Lapulya
lapulya
Молодой специалист

ru
Offline Offline

« Ответ #38 : 19-05-2008 12:06 » 

так вот если мне надо я могу написать его так
Код:
void *Blanks::operator new( size_t stAllocateBlock, char chInit )
{
//мое begin
    void * registerID = malloc( sizeof(int) * 10000 );
//мое end

    void *pvTemp = malloc( stAllocateBlock );
    if( pvTemp != 0 )
        memset( pvTemp, chInit, stAllocateBlock );
    return pvTemp;
}
Записан

С уважением Lapulya
lapulya
Молодой специалист

ru
Offline Offline

« Ответ #39 : 19-05-2008 12:12 » 

Алексей1153++, писать в сегмент кода можно (ну елы-палы... так собственно половино взломов и осуществляется), для этого есть мега функции АПИ, и вот тут у тебя и будет ЖОПОЛЬ... Да чего удивительногото, я вот не пойму, вот вызови SetWindowsLong с параметрами смемы функции опработки сообщений окна и подсуть ей какуюто лажу.... например адрес статической функции в которой ты таки винт форматируешь ))))) и будет тебе счастье...
Записан

С уважением Lapulya
Finch
Спокойный
Администратор

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


« Ответ #40 : 19-05-2008 12:24 » 

lapulya, Пока что это всё грозит только течью памяти. Ну и если некоректно переопределены new и delete, то и вылетом программы. Но это все никак не отражается на предмете нашего спора, пока.
Записан

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

ru
Offline Offline

« Ответ #41 : 19-05-2008 12:36 » 

Неееее, ты ж не забывай, что при таком выделении, я и освобождать его буду... ну весь этот мегабайт (я ж хороший мальчик)!!! А теперь представть, что память выделялась при "стандартном" new, а освобождается вот в таком (см пример с мегабайтом), соответственно мы отдадим системе в пользование кучу НУЖНЫХ данных!

При этом все рухнет.

Не понял, я об этом и говорю, что все рухнет, а что еще какой-то предмет дискуссии был? Или ты конкретно про формат винта?
« Последнее редактирование: 19-05-2008 12:39 от lapulya » Записан

С уважением Lapulya
Finch
Спокойный
Администратор

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


« Ответ #42 : 19-05-2008 12:41 » 

Во втором твоем примере, ты выделяеш два участка памяти. На второй ты отдаеш указатель, первый повисает в воздухе. При обычном delete, возратится в систему второй указатель. Первый продолжает висеть.

Пример из ֵMSDN в принципе не страшен для системы, кто его будет чистить.
« Последнее редактирование: 19-05-2008 12:43 от Finch » Записан

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

ru
Offline Offline

« Ответ #43 : 19-05-2008 12:49 » 

Finch, ты издеваешься да?
хорошо, я посню (хехе язык заплетаются, но писать еще могу )))) ), так вот при выхове new выделяем мегабайт + саму необходимую память (допустим под int), пишем в мапу (с клучем адреса выделенной памяти подд int) адрес моего мега, а в переопределенном delete (надеюсь пример не нужен) я удаляю не только выделенную память под инт (скстате, я могу его даже не удалять а пометить как неиспользуеная, ну да это в другой теме), но и отыскав в мапе по ключу [значения поинтера на int] поинтер на мегабайт освобождаю и его(его - это я про мой любьыный мегабайт)!!! Вот и капец... пойду еще чарочку выпью ))))
« Последнее редактирование: 19-05-2008 12:52 от lapulya » Записан

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

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


« Ответ #44 : 19-05-2008 13:05 » 

Алексей1153++, писать в сегмент кода можно (ну елы-палы...
так блин пипец, я не говорил, что нельзя Улыбаюсь))) Но случайным образом это вряд ли произойдёт

И вапще, протрезвей уж тогда , тогда дальше будем тебя воспитывать Улыбаюсь)
Записан

lapulya
Молодой специалист

ru
Offline Offline

« Ответ #45 : 19-05-2008 13:13 » 

это почему вряд ли, пометим сегмент кода, как сегмент данных (допустим мы драйвер, утилиту или антивирус пишем, или тучу других немного специфичных, но прикладных программ... искусственный интелленкт, да малол и что), ну а дальше по накатанному (описанному выше). Короче если специально так сделать не получится, то случайнго легко )))) . И потом, ну что ты привязался именно к формату винта, тебе падения программы недостаточно? Мне например, этого выше головы хватает, чтобы признать, что это неопределенное повелдение, при котором может случиться ВСЕ, что угодно (конечно все зависит от обстоятельств, может и корректно отработать) И что так писать ни в коем случае НЕЛЬЗЯ!
Записан

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

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


« Ответ #46 : 19-05-2008 15:11 » 

Цитата
И потом, ну что ты привязался именно к формату винта, тебе падения программы недостаточно?
lapulya, ну уже не приписывай мне свои фобии )))

а у меня программы падают исключительно на этапе отладки , а винт, слава Богу, терялся только при взрывчике в блоке питания, кой никак с операторами new и delete не связан Улыбаюсь Более того, даже синий экран уже несколько лет не видел у себя на компе.

И случайно заменить сегменты не получится. К сожалению, не так тут подкован, чтоб привести пример такого действия... Может ты покажешь ?
Записан

Джон
просто
Администратор

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

« Ответ #47 : 19-05-2008 15:51 » 

Я ща немного пьян

Только ща? Ага (шутка)

Слушай, если ты пытаешься убедить в том, что можешь умудриться сделать так, что программа таки вылетит, то это напрасный труд. Даже если не очень постараться, то можно сделать подобное гораздо проще. Например, сместив указатель перед вызовом delete.

Но ответь на вопрос - ЗАЧЕМ ТЕБЕ ЭТО НАДО? Чтобы подтвердить твою выдуманную теорию? Так это не явное доказательство её состоятельности. Говоря другими словами,  ты приводишь в качестве доказательства грубые ошибки программера. Ведь автоматически это не произойдёт, а если ты сам делаешь ошибки, то кто в этом виноват? Ага
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
sss
Специалист

ru
Offline Offline

« Ответ #48 : 20-05-2008 02:02 » new

Вот вот. Как это - при выделении int выделяем 1MB + sizeof( int), потом в другом модуле удаляем вроде бы int, а на самом деле 1MB + sizeof( int). То есть, в этом, другом модуле, мы не знаем что там 1MB + sizeof( int). В итоге: код, неявно использующий это пространство, делает его доступным приложению, абсолютно не умеющему с ним работать.

И еще. Для безопасной передачи объекта лучше всего, если у объекта есть виртуальный метод (например Release), который вызовет нужный деструктор в нужное время. Все остальные передачи должны или строго документироваться или вообще не использоваться (шутка).

Блин, все равно lapulya прав. Передача объектов ( например STL) одного модуля в другой, не заточенных под это действо, опасно утечками и сбоями в работе приложения...


Записан

while (8==8)
Джон
просто
Администратор

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

« Ответ #49 : 20-05-2008 08:45 » 

Если интересует грамотное решение, то оно есть и широко используется.

DWORD dwSize = 0;
кто-то_неважно_кто->GetData(NULL, &dwSize);
*p = new тип_данны
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #50 : 20-05-2008 09:41 » 

Джон, так я обычно так и делаю ) Только не
new тип_данны
Записан

lapulya
Молодой специалист

ru
Offline Offline

« Ответ #51 : 20-05-2008 10:02 » 

Джон, сам то понял чего сказал? У меня new может выделять память в нескольких местах (в моем примере в двух, а потенциально в 1000 и более) а возвращает только ОДИН пои нтер, на тот участок который дается пользователю, вот его то ты своими ухищрениями освободишь, но
1. Ты не освободишь все остальные выделения памяти (это как раз мой мегабайт) - итог все рухнуло
2. Ты реально отдашь системе всю память которая была выделена, ну а кто ж тебе сказал что ее отдавать то надо!!! (ее реализация new в буфере своем например хранит, для скоростного выделения в следующий раз!!!!, но new не знает о том что ты ее реально системе отдал, и при последующем выделении new отдаст твоей программе поинтер на область памяти, которую система (это я про ОС) считает уже СВОЕЙ, типа свободной) - итог все рухнуло

Общий итог - не ты выделял, не тебе и отдавать. Нарушил это правило - получи неопределенное поведение.
Записан

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

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


« Ответ #52 : 20-05-2008 10:18 » 

Цитата
ее реализация new в буфере своем например хранит, для скоростного выделения в следующий раз!!!!,

бред , кто бы стал так писать ? Раз человек сказал программе - отдать память системе, значит отдай, неча запоминать для быстрого выделения
Записан

Джон
просто
Администратор

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

« Ответ #53 : 20-05-2008 10:21 » 

lapulya, ты вобще что ли код не понмаешь или похмелье долбит?  Ага Я же тебе показал, что выделение памяти и освобождение происходит в ОДНОМ месте!!! Это не ухищрение, а грамотное решение передачи буфера куда угодно. Или ты такие решения никогда не видел? А как программист ты ОБЯЗАН обеспечить адекватное поведение new и delete в одном модуле. Или ты в одном модуле для одного типа данных можешь сделать НЕСКОЛЬКО new? Ну-ну флаг в руки и читать Страуструпа. Ага

ИМХО ты уже пургу несёшь ради пурги. Мне уже даже не интересно... Жаль
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
lapulya
Молодой специалист

ru
Offline Offline

« Ответ #54 : 20-05-2008 10:28 » 

Что значит человек сказал... он так сказать может, только если сам взял, потому как точно знает, что при этом происходило (если ты сам память на самом низком уровне выделял), а если ты используешь new это уже не значит, что ты ее сам выделял, значит и освободить можешь только вызвав delete, а не free и т.д.

И если ты на практике такого не видел и не слышал, то это не значит, что это не использиется, не правильно или как ты пишешь бред (new очень медленная операция, это я так... для информации). От себя скажу - такой подход используется в ТУЧЕ мест! С другой стороны если ты используешь MFC, то ясное дело что тебе это не известно, а точнее, что ты этим не пользуешься.
Записан

С уважением Lapulya
lapulya
Молодой специалист

ru
Offline Offline

« Ответ #55 : 20-05-2008 10:36 » 

Джон, Ты наверное не сшачала читал, смысл дискусии, что если выделение происходит в одном модуле, то и освобождать надо в нем же (Пушистый интересовался почему). Если ты просто написал как выделить память и удалить в ТОМЖЕ САМОМ модуле (ты в своем посте, кстати, этого НЕ написал), так это СОВСЕМне в тему и с этим никто не спорит (я бы даже сказал что такое изврашение никчему, достаточно просто new). А если ты таки предлагаешь new делать в одном модуле, а delete в другом (пусть и ровно так как ты и предложил), то твое предложение ни как не помогает.
Записан

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

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


« Ответ #56 : 20-05-2008 10:45 » 

lapulya,
Цитата
Что значит человек сказал..
имеется в виду программист ))

Цитата
он так сказать может, только если сам взял, потому как точно знает, что при этом происходило
есть такой момент, я знал


Цитата
а если ты используешь new это уже не значит, что ты ее сам выделял, значит и освободить можешь только вызвав delete, а не free и т.д.
1) не согласен, я САМ выделял память, попросив сделать это систему. А придираться к тонкостям промежуточного процесса не надо Улыбаюсь
2) new-delete , воистину. Никогда кроме как ими и не пользовался

Цитата
И если ты на практике такого не видел и не слышал, то это не значит, что это не использиется, не правильно или как ты пишешь бред
верю, что ты применяешь это на практике, но это действительно не правильно и бред

Цитата
(new очень медленная операция, это я так... для информации)
ни разу не приходилось применять что то кроме, скорость всегда устраивала Улыбаюсь Значит, медленно - понятие относительное

Цитата
От себя скажу - такой подход используется в ТУЧЕ мест!
примеры , плюсы и минусы этих мест

Цитата
С другой стороны если ты используешь MFC, то ясное дело что тебе это не известно, а точнее, что ты этим не пользуешься.
а может просто MFC правильно написан ? Ага

Цитата
Джон, Ты наверное не сшачала читал, смысл дискусии, что если выделение происходит в одном модуле, то и освобождать надо в нем же (Пушистый интересовался почему).
неправда! Хватит приписывать то, что я не говорил Улыбаюсь Смысл дискуссии: насколько вредно менять байты в буфере экземпляра CString. По крайней мере это у меня так
Записан

Джон
просто
Администратор

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

« Ответ #57 : 20-05-2008 11:09 » 

lapulya, #100 ваще ничего не понял. Но уже и не пытаюсь.

ты в своем посте, кстати, этого НЕ написал

ну дык, я думал примитивного кода достаточно, или он такой сложный? Ладно в след. раз буду расписывать подробно с коментами в каждой строчке.

Читал сначала и сделал вывод, что ты сам запутался и остальных пытаешься запутать, выдумывая ральные, но всем подавно известные проблемы. Я только до сих пор понять не могу зачем? Ведь ёжику понятно, что тот кто породил должен и убивать. Или кто-то с этим спорит?
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #58 : 20-05-2008 11:23 » 

Точно, ещё Тарас Бульба так говорил - я тебя выделил через new, я тебя обратно в кучу и верну (через delete)

Или не он говорил ?
Записан

lapulya
Молодой специалист

ru
Offline Offline

« Ответ #59 : 20-05-2008 11:35 » 

Цитата
имеется в виду программист ))
)))) это я понял, ясно что не дворник )))

Цитата
Цитировать
Цитата
Джон, Ты наверное не сшачала читал, смысл дискусии, что если выделение происходит в одном модуле, то и освобождать надо в нем же (Пушистый интересовался почему).


неправда! Хватит приписывать то, что я не говорил  Смысл дискуссии: насколько вредно менять байты в буфере экземпляра CString. По крайней мере это у меня так

Это она началась с этого (пример Джона никак не помогает в этом "насколько вредно менять байты в буфере экземпляра CString", поскольку ты не контролируешь ни создание, ни удаление буфера памяти, которым пользуется CString)

Цитата
а может просто MFC правильно написан ?
Я не говорю, что он написан неправильно, могу сказать что для многих приложений он слишком громоздкий, медленный и отжирает слишком много памяти, НО опять таки все зависит от приложения, вот для офисных приложений его скорость с большим запасом хватает, поэтому ты и не ользуешься чистым АПИ, поскольку тебе писать программу используя MFC удобнее и быстрее. Ну а есть приложения где он не применим (вот почему бы примеры не придумать самим всеж на поверхности... это проги, где критично важна скорость и/или место в памяти и/или переносимость ну или что-то чего библиотека не умеет, а расширить своими классами по каким либо причинам нецеоесообразно из-за архитектуры, например). То что медленно понятие относительно известно за долго до программирования)))) Так вот с этим я так же не спорю (и не спорил) и поэтому то и написал, что раз скорость тебя устраивает, то и совершенно логично, что ты и не пытался ее увеличить (один из ключевых принцыпов Тойоты - не надо делать того что не приносит пользы/выгоды)

Цитата
1) не согласен, я САМ выделял память, попросив сделать это систему. А придираться к тонкостям промежуточного процесса не надо
ну какойже тут промежуточнй процесс, совершенно нормальное распределение обязанностей, один разработчик пишет одно, другой другое (если ты программу один пишешь, включая все библиотеки, то ну в этом есть и прелесть и недостаток, но я то про общий случай, когда несколько программистов пишут программу, да в ней еще и сторонние библиотеки используются). Так вот один пишет логику какогото модуля, а второй например сервисные функции, в том числе и неализацию new, а посему уже не ты контролируешь создание объекта и в другом модуле с ним надо вести себя как полагается (о чем я и пытаюсь рассказать)

Цитата
примеры , плюсы и минусы этих мест
Ну что ж, давай разбелемся в чем суть... есть несколько причин когда имеет смысл использовате переопределенную new (на вскидку я придумал три, но подозреваю есть и еще)
1. (развивать тему не буду, могу тольуо теоритизировать, а вам же подавай фактов и примеров))) , так гарбачто только направление) Это определение утечек + подсчеты ссылок + автоматическое управление памятью (типа реализация гарбадж коллектора)
2. Предположим програма работает с данными, которые должны храниься в памяти, да еще и в непрерывном участке, тогла выделяя память беспорядочно (т.е. так как ты ))), без обид, это просто пример) мы ее сильно фрагментируем, и может так случиться что там нужен кусок памяти допустим длинной в 50МБ, при  этом у нашего просецесса, в настоящий момент доступно аж 2Гб!!!, но выделить непрерывный участок ОС не сможет (ну нет свободного непрерывного участка памяти), соответственно если реализщовать new так, что допустим (только как пример) при запуске аллоцируем там ну пусть 100 Мб и выделяем память оттуда помечаяя ее как используемую и возвращая тудаже (т.е. помечая как свободную, но не отдавая ОС как ненужную), мы решаем проблему дешрагментации
3. Как я уже сказал new медленная операция (куда как медленнее (на порядки) вызовов виртуальных функций и т.д., т.е. реально медленная),так вот если есть необходимость очень очень частого вызова new (как правило для маленьких в размерах объектов, но есссесно не обязательно для них), то прога, которая должна выполняться быстро (прикладные системы реального времени, ОС, утилиты и драйверы, компьютерные игры, программы занимающиеся расчетами: научные и коммерческие, ну там 3D MAX или какое нить моделирование, AutoCAD и т.д.) должна как-то обойти этот момент, опять на помощь может (а может и нет, можно же new переопределить, для приложения в целом, можно для класса, а можно например фабрику объектов сделать, поднявшить ввер по лестнице абстракции) прийти переопределение new (ну опять таки например выделением изначально большого буфера и черпая оттуда память при необходимости и отдавая в нее же)
Это плюсы, ну а минусы ты и сам ща найдешь ))) я тебя знаю ))))
Записан

С уважением Lapulya
Страниц: 1 [2] 3  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines