Skrivet av klk:
Det där var inte riktigt vad jag frågade efter och det förstår du nog med. Jag ville veta hur jag kastar ut på blocknivå
Att köra en rensning på allt har alltid fungerat
Det är inte alls så självklart att man kan tvinga fram en GC. Utanför debugging är det en operation man nästan aldrig behöver eller ens bör göra då det sällan är positivt för prestanda.
Vill man kasta ut saker på blocknivå får man göra en custom-memory allocator, vilket är möjligt i stort sett alla GC-språk. Specifikt är det möjligt i C# (har använt mig just av arena-allokator där, är högst lämpligt om man t.ex. vill göra vettiga partikelsystem i C#) och definitivt möjligt i Go (förutom denna shit-storm kring C++ framtid p.g.a. dess säkerhetsbrister pågår också en sådan runt varför Microsoft valde Go när man optimerade prestanda i Typescript kompilatorn, det i stället för C#, Rust eller C++. En väldigt viktig orsak är "Go is the lowest level language that exist, still using a GC").
Men om man tar ett kliv in i detta millennium och därmed att multicore är normen så finns väldigt ofta begränsningar på minnesallokering som inte spelar någon direkt roll för enkeltrådade fall. Det är enklare/effektivare att hantera lock/wait-free algoritmer om man sätter begränsningen att minne är typ-stabilt, d.v.s. efter allokering måste en viss minnesadress representera samma typ fram till dessa att minnes frias igen. Med den begränsningen lär nog i princip alla programspråk kunna köra med en custom-memory allocator om behov uppstår.
Skrivet av klk:
Exakt, det var just det jag ville få bekräftat. Man släpper hela kontrollen av minnet till GCn och varför är det så dåligt?
C och C++ är språk som skiljer sig mot i princip alla andra språk. Det är flera saker som skiljer men en av de viktigaste är prestanda. Och för att få upp prestanda behöver utvecklare förstå vilken maskinkod som genereras.
Kompilatorn (förhånad att jag behöver nämna detta...) är ett mycket viktigt verktyg för C och C++ utvecklare. Den är viktig i andra språk med men inte alls lika viktig som i C/C++.
När kompilatorn genererar maskinkod behöver den veta vilken typ av maskinkod som är möjlig och det här är en av orsakerna till att ibland C/C++ uppfattas som onödigt komplicerat. Samma sak är ibland orsaker till varför C++ inte kan ta in "vad som helst" för att förenkla språket.
C/C++ utvecklare kan mer eller mindre räkna ut vad för maskinkod som kommer produceras från den kod de skriver.
Kör man en GC exempelvis, och man skall komma åt minne så behöver denna typ av åtkomst kontrolleras, skulle det gå att läsa utanför ett minnesblocks gränser så smäller det.
I säkra språk går inte det. Men i C/C++ lämnas det ansvaret över till programmeraren.
Förutom att det tar tid att kontrollera access mot minne så är det en hel massa optimeringar en kompilator inte kan göra.
Detta är också orsaken till att jag frågade efter om det går att styra blocken som allokeras.
C har en särställning bland språk i att vara den ABI-specifikation som i princip alla andra språk bygger sin FFI.
Sedan har C, C++, Rust och Zig (möjligen något till jag missat) en särställning i att alla ha manuell minneshantering vilket är ett krav om man bygger applikationer med hårda realtidskrav. Inför man manuell minneshantering i språk som normalt har GC kan även dessa uppfylla detta krav, finns (eller har i alla fall funnits, vet inte om det aktiv underhålls längre) varianter av Java med dessa egenskaper.
Utöver det är det ytterst få saker som kräver C, C++, Rust etc. Om man definierar "prestanda" som "hur snabbt man kan lösa ett givet compute-bounded problem" är rätt arkitektur och rätt val av bibliotek typiskt långt viktigare än val av språk. Se på AI/ML där prestanda är super "trots" att Python är standarden att jobba i.
När man rör sig mot multicore-optimeringar är det snarare en fördel att välja de mer högpresterande GC-språken. Vilket kanske inte egentligen är så förvånande givet att C designades i slutet av 60-talet och C++ skapades i slutet av 70-talet, långt innan multicore var normen (båda dessa språk var ju väldigt sena med att ens ha standardiserat stöd för trådar, 2011 i båda fallen).
Skrivet av klk:
Det är en reporter som gör sin egen tolkning.
Absolut! Dock högst intressant att läsa reaktionerna givet att denna "influencer" ändå har >700k följare. Och det som tas upp där är helt on-topic för denna tråd.
Hela "C++ framtid" handlar i nuläget primärt om vilken väg man ska ta
* Bjarne anser rätt mycket att problemet redan är löst. Det som saknas är bättre verktyg, han trycker på "Profiles" som i praktiken är ett sätt att göra så att specifika delar av språket (de delar som anses vara "problematiska") inte längre kompilerar (säkerhet by opt-out). Man kan då gradvis skriva om existerande kod i "modern" stil, ett exempel som lyfts fram är att C-style arrayer och pekar-aritmetik ska bannas, istället ska man använda C++11 och senare tekniker.
* Safe-C++ lägret tycker det fortfarande finns en rad brister och vill rätt mycket kopiera de delar från Rust som visat sig vara väldigt värdefulla för att i stort sätt helt lösa de vanligaste orsakerna till säkerhetsproblem i C och C++.
* TrapC (som jag personligen tror är klart bästa vägen framåt) är OK med ett par "breaking-changes" till språket, med fördelen att slutresultatet löser problemen samtidigt som själva stilen på hur man kodar bevaras nästan helt. C++ saknar tyvärr ett motsvarande förslag (än så länge).
* Ett sista läger är väl Carbon och Cpp2. De är rätt mycket för C++ vad Typescript är för Javascript och t.ex. Kotlin är för Java. Man anser att det inte är realistiskt att fixa de underliggande problemen med språket, samtidigt som man också inser att det redan finns så mycket legacy-kod som man behöver ha 100 % stöd för. Ett sätt att hantera detta är att skapa ett nytt språk som inte har vårtorna, men som "bara" transpile:as till det underliggande språket (vilket är kanske viktigast för just C++ då det saknar en standardiserad ABI).
* Eller möjligen är sista lägret de som hävdar: "this is fine!". Vet inte om det finns något relevant antal här...