LINUX.ORG.RU

C++11 и управление памятью

 , ,


0

8

Прочитал недавно о смарт-поинтерах в C++11. Можно ли считать это полноценной заменой GC используемых другими языками программирования, такими как Java/C#? Какие современные компиляторы полноценно поддерживают C++11? Есть ли полноценная поддержка C++14?

★★★★★
Ответ на: комментарий от vertexua

Вот это

	movabsq	$10000000000, %rcx      # imm = 0x2540BE400
	.align	16, 0x90
.LBB0_1:                                # =>This Inner Loop Header: Depth=1
	incq	%rsi
	decq	%rcx
	jne	.LBB0_1


должно было быть распознано и вычислено на этапе компиляции. Если компилировать с -O3, то так и происходит. А с -O2 компилятор почему-то тупит для shared_ptr, но справляется для unique_ptr. Почему именно — я не разобрался, т.к. почти не пользуюсь шлангом. А с gcc разницы во времени работы нет.

Manhunt ★★★★★
()
Последнее исправление: Manhunt (всего исправлений: 1)

Можно ли считать это полноценной заменой GC используемых другими языками программирования, такими как Java/C#?

Нет.

mix_mix ★★★★★
()
Ответ на: комментарий от bbk123

Потому, что все еще можно опростоволоситься при разыменованиии нулевого указателя, а так же вызвать утечку памяти циклическими ссылками. В языках с GC тебе нужно очень сильно извернуться что бы спровоцировать подобное поведение.

Aswed ★★★★★
()
Ответ на: комментарий от next_time

а как же вызов деструкторов (нормальные языки с GC, тот же шарп, их умеют)?

Если в типе деструктор не определен явно, ничего не вызывается.

encyrtid ★★★★★
()
Ответ на: комментарий от hlamotron

Память — базовый ресурс, который хранит все остальные ресурсы. Так что GC в первую очередь собирает ненужную память, а во вторую уже вызывает все эти финализаторы, которые прибирают остальные ресурсы.

ilammy ★★★
()
Ответ на: комментарий от ilammy

Как быть с недетерминированностью этого сбора? У нас, например, может быть еще много памяти, а файловые дескрипторы на исходе.

anonymous
()
Ответ на: комментарий от Manhunt

...and calling each destructor of each object being deallocated

Разве это «проблема» именно ARC? Ведь при использовании GC деструкторы тоже могут быть и тоже будут вызываться, просто «неизвестно когда».

DarkEld3r ★★★★★
()
Ответ на: комментарий от next_time

безопасность памяти при тотальном использовании RAII ничуть не ниже, а часто даже и выше, чем в языках с GC.

Почему выше?

DarkEld3r ★★★★★
()
Ответ на: комментарий от anonymous

В языках типа Шарпа или Джавы GC не отвечает за уничтожение неуправляемых ресурсов, это делается вручную.

encyrtid ★★★★★
()
Ответ на: комментарий от vertexua
$ clang++ -O2 -DPTR_TYPE=shared_ptr --std=c++11 sh.cc -o ./sh_test && time ./sh_test
10000000000

real	0m0.002s
user	0m0.000s
sys	0m0.002s


$ clang++ -O2 -DPTR_TYPE=unique_ptr --std=c++11 sh.cc -o ./sh_test && time ./sh_test   
10000000000

real	0m0.002s
user	0m0.000s
sys	0m0.002s

$ clang -v
Ubuntu clang version 3.4-1ubuntu3 (tags/RELEASE_34/final) (based on LLVM 3.4)
Target: x86_64-pc-linux-gnu
Thread model: posix

$ ldd --version
ldd (Ubuntu EGLIBC 2.19-0ubuntu6.6) 2.19
anonymous
()
Ответ на: комментарий от encyrtid

Если в типе деструктор не определен явно, ничего не вызывается.

GC вообще не вызывает деструкторов. Он может вызывать финализаторы.

anonymous
()
Ответ на: комментарий от ilammy

уже вызывает все эти финализаторы, которые прибирают остальные ресурсы.

Не самый лучший вариант. Лучше закрывать ресурсы вовремя. Если получается, то через try-with-resources/using/with.

anonymous
()
Ответ на: комментарий от DarkEld3r

Ведь при использовании GC деструкторы тоже могут быть и тоже будут вызываться, просто «неизвестно когда».

Это все таки финализаторы - отдельный механизм. Деструкторы вызываются в строго определенный момент времени, что позволяет иметь строгую иерархию вызовов. Финализаторам же тяжело приходится, т.к. нет даже гарантии корректности полей «завершающегося» объекта. Я вообще не понимаю, для чего их ввели. Без них все проще и понятнее. Разве что только для отслеживания ситуаций с утечками ресурсов... Но и тут нет гарантии, что проблема проявится.

anonymous
()
Ответ на: комментарий от encyrtid

define «деструктор» в терминах шарпа/жабы.

undefined. Наиболее близкий аналог - автоматический вызов соответствующего метода при использовании using/try-with-resources. Но тут есть проблема с иерархиями ресурсов и т.п.

И мне деструкторов в языках с GC не хватает, т.е. после C++ тот же try-with-resources выглядит, как костыль.

anonymous
()
Ответ на: комментарий от anonymous

Финализаторы никто и не использует. На моей памяти — вообще и абсолютно никто.

Их добавляют на всякий случай — а вдруг кто забудет закрыть файл? Тогда когда-нибудь из приберем, одновременно со сборкой мусора. А в норме они нафиг не сдались.

anonymous
()
Ответ на: комментарий от encyrtid

В языках типа Шарпа или Джавы GC не отвечает за уничтожение неуправляемых ресурсов, это делается вручную

А если прогер не сделал и GC удалил объект - получаем утечку ресурса?

anonymous
()
Ответ на: комментарий от Midael

Такие ресурсы принято чистить детерминировано через IDisposable + using (с#) или AutoCloseable + try (java)

Так это равносильно ручному управлению памятью.

anonymous
()
Ответ на: комментарий от anonymous

Финализаторы никто и не использует

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

anonymous
()
Ответ на: комментарий от anonymous

Будет вызван финализатор и он закроет ресурс. Хуже будет в том случае, если сборщик очень долго не будет удалять этот объект. А это вполне реально.

anonymous
()
Ответ на: комментарий от anonymous

Так это равносильно ручному управлению памятью.

Нет. Это ручное управлению ресурсами. Но память в такой системе не является ресурсом.

anonymous
()
Ответ на: комментарий от ilammy

Как-то хреново, если ничего лучше до сих пор не придумали.

Я пытаюсь придумать систему со сборкой мусора, и наткнулся именно на это. Лучшее что смог придумать - запускать GC при нехватке любого ресурса, не только памяти.

anonymous
()
Ответ на: комментарий от anonymous

Это все таки финализаторы - отдельный механизм.

Ну да. Хотя в шарпе они почему-то называются именно деструкторами.

Вообще, у меня была претензия именно к формулировке, где говорилось, что один из недостатков RC - вызов деструкторов. Но ведь в RC можно положить и обьект с «отсутствующим» (тривиальным) деструктором. И наоборот - можно наделать финализаторов и с GC иметь (отложенный) «точно такой же» вызов.

DarkEld3r ★★★★★
()
Ответ на: комментарий от DarkEld3r

у меня была претензия именно к формулировке, где говорилось, что один из недостатков RC - вызов деструкторов

Мне вот кажется, что это достоинство, ибо универсальный способ работы с любыми ресурсами.

anonymous
()
Ответ на: комментарий от vertexua

А что ты вообще хотел этим кодом померить?

for (long x = 0; x < 10000000000L; x++) {
    ptr->Inc();//какое отношение это имеет к *_ptr?
  }
anonymous
()
Ответ на: комментарий от vertexua

Что-то не так?

Я не вижу смысла сего действа, возможно его видишь ты - вот я и спрашиваю.

Ну это просто отдельная функция которая возвращает разыменование поля класса. У обоих она идентична, да и в целом остальной класс на неё никакого влияния не оказывает.

anonymous
()
Ответ на: комментарий от anonymous

А если прогер не сделал и GC удалил объект - получаем утечку ресурса?

Да. Либо можно добавить финализатор как MS-овском disposable pattern.

encyrtid ★★★★★
()
Ответ на: комментарий от anonymous

Оказалось она не совсем идентична и работает с разной скоростью. Мы уже нашли в этом треде почему, почитайте

vertexua ★★★★★
()
Ответ на: комментарий от Pavval

Кстати судя по моей ссылке в студии таки ПОЛНАЯ поддержка с++11, нет фич только из 14го/17го.

Dudraug ★★★★★
()
Ответ на: комментарий от vertexua

real 0m0.001s

Тебя нисколько не смутило, что цикл из 10 миллиардов итераций выполнился меньше, чем за одну миллисекунду?

i-rinat ★★★★★
()
Ответ на: комментарий от tailgunner

кхм... какая же в плюсах «необходимость» в этом УГ? сто лет без них жили и ещё сто лет проживём. без проблем совершенно. мозги не заменяются обилием всяких примочек. если их нет, то в плюсы соваться бесполезно. для таких случаев как раз и есть жаба, до-диез и прочее такое.

Iron_Bug ★★★★★
()
Ответ на: комментарий от Iron_Bug

кхм... какая же в плюсах «необходимость» в этом УГ?

Читай внимательно

@

Врубайся в контекст

сто лет без них жили и ещё сто лет проживём. без проблем совершенно.

Живите, не вопрос.

мозги не заменяются обилием всяких примочек

Выкинь компьютер и считай на счетах. Ну а чо, мозги у тебя есть, зачем тебе примочки.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

я, кстати, умею на счётах считать. не везде бывают компьютеры под рукой :)
но по сути все эти примочки с автоматическим убиранием говна за программистом сродни няньке, которая за дитём малолетним убирает какахены. потому что дитя не приучено срать в нужном месте и смывать за собой. для взрослых сознательных людей это не представляет проблемы и нянька не нужна.

Iron_Bug ★★★★★
()
Ответ на: комментарий от Iron_Bug

я, кстати, умею на счётах считать

Всего-то? А самомнения столько, словно ты на них хотя бы MP3 декодируешь.

но по сути все эти примочки с автоматическим убиранием говна за программистом сродни няньке, которая за дитём малолетним убирает какахены

фейспалм

Найди царя и поговори. Он тоже гордится своим мозгом и имеет фиксацию на продуктах выделения.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Балаболка, ты опять срёшь и никто тебя в дерьмо не макает <3.

Выкинь компьютер и считай на счетах.

Чем компьютер отличается от счёт? Тогда уж считай мозгом.

Ну а чо, мозги у тебя есть, зачем тебе примочки.

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

Руки человека имеют устройство такое, которое позволяет ими что-то делать, т.е. создавать себе инструмент, а уже потом им тыкать в других. Точно так же работает и мозг - мозг создаёт инструменты. Ему не нужно обладать такой примитивщиной, как счёт - он может собрать считалку на коленке.

Там нахрен на кубике ануса весит обработчик сильнее, чем это убогая помойка «компьютер».

Это венец эволюции - умение создавать. А умение создавать подразумевает понимание и само создание - ты не можешь создать что-то, что твоя копна соломы просто не способна обработать и представить. А «автоматическое управление» вызванное не созданным человеком инструментов, а использование готового в связи свой профнепригодностью.

Поэтому амёба, которая деградировала до уровня счёт, потеряв всё человеческое и мечтает о машине, которая заменит ей умение создавать - т.е. понимать и создавать решения.

Давай ещё раз. Человек царь зверей не потому, что любой с помойки может взять готовый ствол и подстрелить обезьяну - это может сделать и обезьяна. Человеку наличие чего-то заменяет умение это что-то создать. Без этого - ты бабуин.

И это не значит, что человек не будет пользоваться стволами - он ими будет пользоваться, ибо он их создал - они лишь физическое воплошение его интеллектуальнйо мощи.

Поэтому сливы твои на «не юзай» - не работают, ибо я повелитель, а ты дерьмо. Я могу, а ты нет. Для тебя это замена мозга, а для меня - моя воля и мощь.

anonymous
()
Ответ на: комментарий от Iron_Bug

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

lazyklimm ★★★★★
()
Ответ на: комментарий от lazyklimm

У дитя просто современный автоматический туалет!

Аналогия не работает - без разницы в какой трон ты срёшь - фаянсовый или деревянный - ты всё равно срёшь в одно место - в дырку. Не на пол, не на ободок, не на сам трон, а именно в дырку. Любые попытки в гц - это прежде всего потакание возможности срать где угодно и как угодно.

При этом если я в сишке взял свой трон - выкинул его. Создал себе хату и для неё инстанс аллокатара - я могу её засирать как угодно - после я просто ресетну хату и у меня чисто.

А вот ГЦ и крестопомойка - это именно выгребание говна. Т.е. ты срёшь, а потом рантайм как бы выполняет обратную операцию в обратном порядке. Посрал ты 1000500 раз - он обратнопосрал те же 1000500. Ахренеть. Просто новые технологии.

Технологии у меня, а у тебя помойка. Фу нахрен, свиньи.

anonymous
()
Ответ на: комментарий от anonymous

А вот ГЦ и крестопомойка - это именно выгребание говна

В крестах-то что не так? Там только RAII и обычный подсчет ссылок

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.