Visual C ++ G C Интерфейс Как включить и какую библиотеку включить - PullRequest
1 голос
/ 11 июля 2020

Я начал изучать интерфейс G C на C ++ и запустил несколько примеров, доступных в Интернете в Visual 2019 C ++ для следующих функций:

Каждая ссылка выше содержит пример кода, который был скомпилирован в моем VC ++ 2019 и успешно выполнен

Что мне не хватает, чтобы понять, что VS2019 имеет G C по умолчанию включенным - я имею в виду, t нам нужно включить некоторые переключатели компилятора или библиотеки для добавления для компоновки.

Также, если G C включен по умолчанию, то почему у нас нет 'set_pointer_safety', а только ' get_pointer_safety ' ?

Тогда как мы можем использовать функции G C в VC ++, например, когда память освобождается в результате G C?

Ответы [ 2 ]

3 голосов
/ 11 июля 2020

Я начал изучать интерфейс G C на C ++

Вы читали стандарт C ++ 11 n3337 ?

Visual C ++ G C Интерфейс Как его включить и какую библиотеку включить

Как объясняли другие, в Visual C ++

нет настоящего G C

Написание простого сборщика мусора довольно просто.

Просто прочтите руководство G C для руководства и / или Dragon Book и / или Lisp In Small Pieces или эта Однопроцессорные методы сбора мусора paper.

Уведомление что процедуры маркировки или копирования сборки мусора C ++ для вашего G C могут быть сгенерированы инструментами, похожими на SWIG в духе библиотеки s11n . См. Также этот черновой отчет .

Если ваша кодовая база небольшая (несколько десятков тысяч строк C ++ и несколько десятков C ++ class -es), вы можете даже сгенерируйте подпрограммы поддержки G C с вашей собственной метапрограммой (или используя препроцессор GPP , или GNU m4 one или GNU gawk ). Если вы можете и вам разрешено скомпилировать свой код C ++ с недавним G CC (например, G CC 10 в июле 2020 года), подумайте о написании вашего G CC плагин для генерации сборки мусора поддерживает код C ++. См. Также черновик отчета и ссылки внутри него. Обратите внимание: сборщик мусора внутри G CC.

Вас может заинтересовать консервативный G C* 1071 Боэма * библиотекой, либо Frama- C, либо Clang stati c анализатором .

Но написание современного и высокопроизводительного G C требует много усилий, особенно когда ваша программа на C ++ многопоточная. Подробнее см. Проект RefPerSys (с открытым исходным кодом).

PS. На обоих github и gitlab и в других местах вы найдете несколько реализаций с открытым исходным кодом на C или C ++ языков со сборкой мусора, например this (или GNU guile или Python или GH C или Ocaml ). Я рекомендую изучить их исходный код на C ++ или C для вдохновения. И G CC имеет внутри собственный сборщик мусора (см. Также мой старый неподдерживаемый проект G CC MELT и несколько слайдов, о которых я писал).

1 голос
/ 11 июля 2020

Visual C ++ не реализует сборку мусора, поэтому вопросы о том, следует ли / как включить его или какие библиотеки для этого требуются, являются спорными.

Наличие перечисленных функций не означает, что G C существуют. Это только означает, что VC ++ реализует интерфейсы, предписанные C ++ 11, которые позволяют G C работать. Но в последней версии 2019 таких функций нет, и реализация этих функций в VC ++ просто не работает, а модель безопасности указателя « » возвращается как pointer_safety::relaxed, то есть вообще отсутствует. Цитата из заголовка VC ++ memory:

// GARBAGE COLLECTION
enum class pointer_safety { relaxed, preferred, strict };

inline void declare_reachable(void*) {}

template <class _Ty>
_Ty* undeclare_reachable(_Ty* _Ptr) {
    return _Ptr;
}

inline void declare_no_pointers(char*, size_t) {}

inline void undeclare_no_pointers(char*, size_t) {}

inline pointer_safety get_pointer_safety() noexcept {
    return pointer_safety::relaxed;
}

Из Страуструпа G C ABI FAQ:

смягчено: безопасно выведенные и небезопасные указатели обрабатываются одинаково; как C и C ++ 98 [...]

Подробнее о SO о C ++ 11 G C:

...