c和c++這類沒有gc的語言是不是騙自己?

操作系統gc就不叫gc了?


操作系統那個叫收屍


操作系統GC…

你會把『強拆』叫『家政服務』麼?


最後電腦賣給收廢品的也叫GC


我想了一想,C++還是可以有GC的。

我就寫了個簡單的,完全照搬Garbage Collection for Python

#include &
#include &
#include &
#include "gc.hpp"

struct Counter {
static ::std::size_t count;
bool valid;

Counter()
: valid(true) {
}

Counter(Counter o) noexcept : valid(false) {
::std::swap(valid, o.valid);
}

Counter
operator=(Counter ) = delete;

Counter(Counter const ) = delete;
Counter
operator=(const Counter ) = delete;

~Counter() {
if (valid)
count++;
}
};

::std::size_t Counter::count = 0;

struct Cycle : public ::gc::Object& {
Counter c;
::gc::Ptr& GC_MEMBER(peer);
};

int
main() {
{
Counter::count = 0;
{
auto p = ::gc::make&({});
}
assert(Counter::count == 1);
}

{
Counter::count = 0;
{
::gc::Ptr& p1;
{
auto p2 = ::gc::make&({});
p1 = p2;
}
assert(Counter::count == 0);
::gc::collect();
assert(Counter::count == 0);
}

assert(Counter::count == 1);
}

{
Counter::count = 0;
{
auto p1 = ::gc::make&({});
auto p2 = ::gc::make&({});
p1-&>peer = p2;
p2-&>peer = p1;
}
assert(Counter::count == 0);
::gc::collect();
assert(Counter::count == 2);
}
}

C++已經被玩壞了,哈哈哈


微軟很多年前出過一個只用來玩耍的操作系統Midori,GC就是寫進了驅動里的,上面跑的native language是C#,還帶有go引以為豪的goroutine的等價實現(逃

C++也可以用庫自己來實現GC,但是限制通常都很大。以前我閑的蛋疼也做了一個(https://github.com/vczh/vczh_toys/blob/master/CppGarbageCollection/CppGarbageCollection/Main.cpp),但是一想到要給所有已經存在的和未來的容器類型也全部弄一遍(除非他們肯重寫),我就覺得沒什麼希望(逃


操作系統並不負責gc,那個的確不叫gc

如果程序gc像操作系統那樣寫,那大一點的程序基本沒法運行了


照你這定義,手動free也算是GC吧……


所以題主你指的是swap out還是oom-killer啊?


系統內核內存泄漏算不算騙自己?

關機後內存清零就不算釋放了?


當然可以有GC了,你自己去實現一個就行。C++這玩意就是「看起來封裝的很好」罷了,實際應用過程中要考慮的還是比較多的。


概念混淆了。

操作系統的GC並不是在C/C++對象不再生存時進行空間釋放,所以不算作某一語言的GC。


問題是,如果你沒有delete 佔滿內存怎麼辦。。。操作系統GC僅僅是釋放掉zombie進程的內存而已 它又不知道一個進程裡面哪些內存是Garbage


推薦閱讀:

如果沒有PGO,JIT 編譯相比AOT 編譯有哪些優勢?
如何從粗通一門編程語言到精通一門?
哪一種計算機語言最適合入門?是C語言嗎?可是我覺得指針難死了!?
各位覺得主流編程語言中哪個編程語言最容易學習?
有什麼好的 Haskell 中文書籍?

TAG:操作系統 | 編程語言 | Java | C編程語言 | CC |