Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.12.2013, 09:13   #1
220Volt
Форумчанин
 
Регистрация: 14.12.2012
Сообщений: 671
По умолчанию Сбрщик мусора в C++

Здравствуйте.
Сегодня копаясь в <memory> обнаружил что в C++11 появилась сборка мусора и как то не очень этому обрадовался. К сожалению у меня нет много времени детально в этом разбираться, поэтому хотел бы задать пару вопросов:
- Могу ли я быть уверен в том что в моем приложении сборщик совсем не активен, следовательно никаких дополнительных расходов?
- Как активируется сборщик? На этапе сборки компилятора или во время написания программы?
220Volt вне форума Ответить с цитированием
Старый 30.12.2013, 11:09   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Интересно, где вы нашли там про автосборщик мусора?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 30.12.2013, 11:27   #3
220Volt
Форумчанин
 
Регистрация: 14.12.2012
Сообщений: 671
По умолчанию

Здесь http://en.cppreference.com/w/cpp/header/memory
Секция Garbage collector support

Вырезка из книги Страуструпа "The.C++.programming.Language.4th.E dition" 34.5. The Garbage Collection Interface:
Код:
... From this basic philosophy it follows that garbage collection is optional in C++. A garbage
collector will not be invoked unless explicitly installed and activated. A garbage collector is not even
a required part of a standard C++ implementation, but good free and commercial collectors are
available. C++ provides a definition of what a garbage collector can do if one is used and an ABI
(Application Binary Interface) to help control its actions. ...

Последний раз редактировалось Stilet; 31.12.2013 в 09:16.
220Volt вне форума Ответить с цитированием
Старый 01.01.2014, 19:12   #4
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,618
По умолчанию

Цитата:
- Могу ли я быть уверен в том что в моем приложении сборщик совсем не активен, следовательно никаких дополнительных расходов?
там есть умные указатели. Если ты из не используешь - никакой сборки мусора не происходит и накладных расходов, соответственно, тоже нет.

Цитата:
- Как активируется сборщик? На этапе сборки компилятора или во время написания программы?
во время выполнения программы (подсчет ссылок). auto_ptr вроде бы и до С++11 был, а нынче добавились всякие хитрые указатели в плане владения (в бусте все это давно было - ничего особо нового не появилось).
Шаблон проектирования "умный указатель" можно было реализовать совсем всегда.

Или я есть еще что-то новое в плане сборки мусора?
rrrFer вне форума Ответить с цитированием
Старый 01.01.2014, 22:08   #5
220Volt
Форумчанин
 
Регистрация: 14.12.2012
Сообщений: 671
По умолчанию

Я не о умных указателя, в новом стандарте появились зачатки автоматической сборки мусора (что меня и напугало). Процитирую Страуструпа (FAQ на его странице):
Код:
Сборка мусора

Сборка мусора (garbage collection) (автоматическое освобождение регионов памяти, на которые никто не ссылается) является опциональной в С++; т.е. сборка мусора не является обязательной частью реализации. Однако, С++11 предоставляет определение того, что может делать сборщик мусора и также содержит ABI (Application Binary Interface) для управления его действиями. 

Правила для указателей и их времени жизни определены в терминах «безопасного указателя» (“safely derived pointer”) (3.7.4.3); грубо говоря - это «указатель на объект или его подобъект, размещенный при помощи оператора new». Вот несколько примеров «небезопасных указателей» известных также как «замаскированные указатели» (disguised pointers), а также то, чего не стоит делать в понятных простым смертным и нормально работающих программах: 

•Изменять указатель, чтобы он указывал некоторое время «в другое место»
	int* p = new int;
	p+=10;
	// ... здесь может запуститься сборка мусора ...
	p-=10;
	// можем ли мы рассчитывать, что int еще не удален? 
	*p = 10;	


•Преобразовывать указатель в int
	int* p = new int;
	// не переносимо
	int x = reinterpret_cast<int>(p);	
	p=0;
	// ... здесь может запуститься сборка мусора ...
	p = reinterpret_cast<int*>(x);
	// можем ли мы рассчитывать, что int еще не удален?
	*p = 10;	


•Существует множество еще более хитроумных трюков. Подумайте о вводе выводе, о битовых операциях и т.п. 

Существуют законные основания использовать низкоуровневую работу с указателями (например, трюк с «исключающим или» в приложениях с сильными ограничениями по памяти), но они не так часто встречаются, как думают многие программисты. 

Программист может явно указать места, в которых нельзя найти указателей (например, в изображении) и какую память нельзя освобождать, даже если сборщик не найдет указателей на нее: 
	// участок памяти, начиная с p
	// (выделенный некоторым аллокатором,
	// который знает размер выделенной памяти)
	// и который не должен быть собран сборщиком мусора
	void declare_reachable(void* p);	
	template<class T> T* undeclare_reachable(T* p);

	// p[0..n] не содержит указателей
	void declare_no_pointers(char* p, size_t n);	   
	void undeclare_no_pointers(char* p, size_t n);


Программист может выяснить текущие правила безопасности указателей и освобождения памяти: 
	enum class pointer_safety {relaxed, preferred, strict };
	pointer_safety get_pointer_safety();


Раздел 3.7.4.3[4]: результат разыменования или освобождения небезопасного указателя не определен, если объект указателя располагается в динамической памяти и указатель не был помечен как доступный (20.7.13.7). 

•relaxed: безопасные (safely-derived) и небезопасные (not safely-derived) указатели анализируются одинаково; это поведение аналогично поведению в С и в С++98, но я преследовал не эту цель; я хотел позволить сборку мусора, даже если пользователь не хранит корректные указатели. 
•preferred: аналогично relaxed, но сборщик мусора может работать для определения утечек памяти и/или для определения разыменования «плохих указателей». 
•strict: безопасные (safely-derived) и небезопасные (not safely derived) указатели могут анализироваться по разному; т.е. сборщик мусора может игнорировать небезопасные указатели. 

Не существует стандартного способа выбрать правильный вариант. Это можно рассматривать как проблему «качества реализации» и «программного окружения».
До этого оставлял ссылку на <memory> там это отражается.
220Volt вне форума Ответить с цитированием
Старый 02.01.2014, 00:52   #6
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,964
По умолчанию

Цитата:
Сообщение от 220Volt Посмотреть сообщение
Здравствуйте.
Сегодня копаясь в <memory> обнаружил что в C++11 появилась сборка мусора и как то не очень этому обрадовался. К сожалению у меня нет много времени детально в этом разбираться, поэтому хотел бы задать пару вопросов:
- Могу ли я быть уверен в том что в моем приложении сборщик совсем не активен, следовательно никаких дополнительных расходов?
- Как активируется сборщик? На этапе сборки компилятора или во время написания программы?
Зборщик мусора, это удаление файлов с ~ таким значком. Не бойтесь. Ваш проект останется в целости и сохранности. Уберуться только копии файлов.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 02.01.2014, 10:25   #7
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,618
По умолчанию

220Volt, но чето ты страшные вещи пишешь. Надеюсь компиляторы этих фич никогда поддерживать не будут ))
rrrFer вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
сборщик мусора goluzov Общие вопросы C/C++ 2 29.04.2012 15:25
Сборка мусора EUGY Общие вопросы C/C++ 0 13.06.2011 21:26
Опрос: Сборщик мусора Пепел Феникса Общие вопросы по программированию, компьютерный форум 15 20.04.2011 19:19
Чистка реестра от мусора Gerzs Софт 1 21.04.2010 09:57
Программа по удалению мусора KORN Софт 12 31.10.2007 08:58