Thread overview
GC and RC
Jun 11, 2019
KnightMare
Jun 11, 2019
KnightMare
Jun 12, 2019
rikki cattermole
June 11, 2019
Lets discuss two worlds: GC and RC.
I want to know how it will be work for self-education. probably others will be interested too.

(1)
int[] findSpanWithMaxSum( int[] arr ) { ... return arr[someBeg..someEnd]; }
this code will work with GC and with nogc for static arrays

let's rewrite it for nogc:
(2)
auto/*rcspan!int*/ findSpanWithMaxSum( inout ref rcarray!int arr )
{ ... return arr[someBeg..someEnd]; }
where rcspan is struct{.rcarray, .offset, .length} that can handle RC.
by ref coz don't needed addref/release. atomic can be expensive.

RC-library:
rcarray!T // and strings
// multidimensional arrays?
// static rcarray? rcspan should be compatible with it too.
rcspan!T // usual slice{.ptr, .length} shouldn't be compatible with RC.
rcmap!(K,V) // rcset!K?
rc!T // smart-ptr
what more?

questions and assumptions:
- RC is atomic for shared vars
- what with weak ptrs?
Form { Label{@weak .parent}; Button{@weak .parent}; }
no need addref/release for .parent. ~Form invokes .release for children. what the type of .parent better: some rcweak!Form or raw Form*?
- how will work ranges for RC-types?
- will be created utility that automatically converts the GC-code to nongc? arrays to rcarrays etc.
- can be added classes with C++new/emplace/destroy semantics?
right now I've got error for scoped!ClassA (class obj at stack):
C:\..\..\import\std\conv.d(4489): Error: No implicit garbage collector calls allowed with nogc option enabled: _d_array_slice_copy
- how can be used different allocators? what exactly they are: struct* or interfaces? with what fields? with function ptrs to alloc/free?

June 11, 2019
On Tuesday, 11 June 2019 at 20:28:51 UTC, KnightMare wrote:
> - will be created utility that automatically converts the GC-code to nongc? arrays to rcarrays etc.

- will the compiler be split into 2 parts?
compiler can generate code from (1) to (2) for nogc automatically when it knows rc-types and how handle it. can remove unnecessary addref/release for params, for returns probably.
pro: user source code can be same. generated code depends only from compiler version or compiler option - GC or RC. (can be same source for RT?)
June 12, 2019
Your over thinking it.
RC is a wrapper struct around a bit of memory.

It won't require compiler changes and it could be backed by GC for allocation (I use RC for system sensitive handles like windows even though it is GC still).