C++ och dess framtid att programmera minnessäkert - Hur går utvecklingen?

Permalänk

Detta är en standardtaktik du använder. När du inte vill svara på en fråga kommer den en motfråga. Ibland om något relaterat, ibland om något orelaterat.

Skrivet av klk:

C++ har konstruktorer och destruktorer, normalt raderas allokerade minnesblock i destruktorn. Det gör de flesta och gör man det så är problemet löst med minnesläckor (oftast i alla fall).

Det du pratar om här är väl RAII? (Jag frågar så vi kan vara överens om terminologin.) Det löser en klass av problem, men inte alla.

Skrivet av klk:

Har jag förstått rätt är det huvudsakliga problemet med att skriva/läsa till områden man inte får läsa/skriva från

Hur många sätt finns det att skjuta sig i foten? shared_ptrs skyddar mot minnesläckor men jag skulle nog säga att det är ännu viktigare att du inte råkar ut för stale pointer-problematik. Du kommer inte att ha kvar pekare till objekt som du tagit bort någon annanstans i koden. För så länge du har kvar en pekare i scope kommer inte objektet tas bort. Med shared_ptr riskerar du inte heller double deletes.

Låt mig formulera om frågan som du undvek genom att ställa en motfråga; kan man vara emot smart pointers och samtidigt använda sig av dem? Det känns lite inkonsekvent. Eller är det bara när man lär sig programmera som man får gå i livets hårda skola och köra manuell minneshantering? När man väl lärt sig är det kanske acceptabelt att använda smart pointers?

Permalänk
Medlem
Skrivet av Ingetledigtnamn:

Detta är en standardtaktik du använder. När du inte vill svara på en fråga kommer den en motfråga. Ibland om något relaterat, ibland om något orelaterat.

Jag förstår inte, har jag sagt att jag aldrig använder smartpointers? Kommer inte ihåg men kan inte tänka mig att jag sagt det för det stämmer inte. I "skitkod" som jag brukar kalla domänspecifik kod använder jag det ofta. Har även skrivit "egna" smartpointers fast då för annan typ av hanering, små hjälpklasser för att hantera objekt.

Skrivet av Ingetledigtnamn:

Det du pratar om här är väl RAII? (Jag frågar så vi kan vara överens om terminologin.) Det löser en klass av problem, men inte alla.

Japp, och som jag skrev ovan, i skitkod är det mitt vanliga

Annan kod som är skriven för att återanvändas och skall vara smart, där läggs mycket tid för att få det hela så optimerat som möjligt och eftersom det återanvänds är det säkrare. Skitkod är fullt med unika lösningar för olika typer av situationer och måste han en annan typ säkerhet.

Skrivet av Ingetledigtnamn:

Hur många sätt finns det att skjuta sig i foten? shared_ptrs skyddar mot minnesläckor men jag skulle nog säga att det är ännu viktigare att du inte råkar ut för stale pointer-problematik. Du kommer inte att ha kvar pekare till objekt som du tagit bort någon annanstans i koden. För så länge du har kvar en pekare i scope kommer inte objektet tas bort. Med shared_ptr riskerar du inte heller double deletes.

För mig är det mycket sällsynt att använda shared_ptrs, det är enligt mig dålig design. Viktigt att veta vem ägaren är till data. När saker flyttar omkring blir koden mycket svårare att hantera.
För varje shared_ptr har jag säkert +50 unique_ptr.

Skrivet av Ingetledigtnamn:

Låt mig formulera om frågan som du undvek genom att ställa en motfråga; kan man vara emot smart pointers och samtidigt använda sig av dem?

Men jag är inte emot dem
De har sin uppgift och där det passar använder man dem.
Hade inte använt dem om man exempelvis skriver en parser men i skitkod så absolut, trådad kod så nära 100% säkert att jag använder det.

Exempel på vad som kan bli problem med för mycket stl och det här är långt ifrån något extremt exempel

/// @brief Type alias for table, which can be either a `gd::table::dto::table` or a `gd::table::arguments::table`. using table_t = std::variant< std::unique_ptr< gd::table::dto::table >, std::unique_ptr< gd::table::arguments::table > >; std::vector< table_t > m_vectorTableCache;

Vad som är så jobbigt med denna typ av lösning är att den är svår och debugga och svår för andra att förstå, normalt tänker jag mycket på att koden skall vara lätt att debugga så det behöver verkligen vara vinster om kod skrivs som ovan

Permalänk
Medlem
Skrivet av Yoshman:

Absolut, han hade helt rätt!

Sen var den minst lika viktiga insikten att för vissa fall, inklusive detta, får man nog acceptera "svengelska" då "överskuggning" inte är en nomenklatur speciellt många kommer känna igen.

Kör man med "override" och "overload" lär de flesta fatta även i ett svenskt kontext.

Jag hade inte reagerat om du inte hade frågat efter vettiga namn på svenska. Utifrån kontexten så var det helt uppenbart exakt vad du menade. Kolla bara på hur många som rör ihop parameter och argument utan att man ens tänker på det. Jag har samma känsla som du att man nog gör sig mer förstådd på "svengelska" än att envisas med att översätta alla termer till svenska. Däremot kan "svengelska" bli lite mycket i tal ibland så jag förstår viljan av att hitta svenska ord.

Däremot förstår jag fortfarande inte vad @kik menar med överlagring och varför det är så viktigt?

Permalänk
Medlem
Skrivet av jclr:

Jag hade inte reagerat om du inte hade frågat efter vettiga namn på svenska. Utifrån kontexten så var det helt uppenbart exakt vad du menade. Kolla bara på hur många som rör ihop parameter och argument utan att man ens tänker på det. Jag har samma känsla som du att man nog gör sig mer förstådd på "svengelska" än att envisas med att översätta alla termer till svenska. Däremot kan "svengelska" bli lite mycket i tal ibland så jag förstår viljan av att hitta svenska ord.

Däremot förstår jag fortfarande inte vad @kik menar med överlagring och varför det är så viktigt?

Oroa dig inte för det vet inte @klk i heller

Permalänk
Medlem
Skrivet av serafim:

Visst var APL intressant att testa och en del grupper höll på med det på rätt hög nivå, skrev till och med användagränssnitt i APL, såg också att det finns en sida om hur man skapar användargränssnitt i Dyalog APL (men man måste ha ett användarnamn och login och det har jag inte). Jag kanske testar igen men just nu är det mycket annat jag vill testa så APL får troligen vänta ett tag.

Den ständigt växande listan med intressanta saker man ska titta på nån gång i framtiden. Jag har knappt skrivit GUI kod i APL men det finns bindings för .Net så man kan skriva .Net / Windows Forms kod direkt i APL. Det finns även ⎕WC som också är win form baserat.

Permalänk
Medlem
Skrivet av jclr:

Däremot förstår jag fortfarande inte vad @kik menar med överlagring och varför det är så viktigt?

Bad AI göra en jämförelse mellan std::vector och rusts Vec. Rust behöver normalt nära dubbelt så många olika metodnamn jämfört med C++ på grund av att de saknar överlagring. Det kanske inte upplevs som så problematiskt om man inte är van vid att skriva generell kod eller skriva kod som skall återanvändas.

Men det är problem som ökar snabbt eftersom man hela tiden behöver hitta på nya namn, namn är svåra att hantera.

Ta en jämförelse, låt säga att du har 1000 skruvar till en bil, är det 1000 olika skruvar hade bilen blivit mycket dyr. Desto mer lika du kan få skruvarna desto lättare blir bilen att skruva samman.

Med överlagring är det enklare att ha samma namnuppsättning för olika typer av objekt och då slipper utvecklare läsa igenom koden. Bra namngivning i C++ och du behöver i princip inte läsa kod, du vet hur du skall använda det eftersom det följer mönster (fasta strukturer) och där är namn en viktig del.

Problemet med avsaknad av överlagring blir speciellt jobbigt i värdeklasser. I alla fall har jag inte lyckats få AI att skriva om C++ kod till något som verkar trevligt och jobba med. std::vector som här jämförs är långt ifrån det värsta exemplet, tvärtom

Med det sagt så är rust ett jättebra undervisningsspråk. För nya utvecklare är tydliga namn lättare att förstå jämfört med "smart" C++ kod

***

### Comparison of `std::vector` (C++) and `Vec` (Rust) Method Proliferation

A key difference between the C++ and Rust APIs is the number of method names. C++ leverages function overloading and context, while Rust uses distinct names to explicitly signal mutability, ownership, and error handling.

**Operation: Get an element**
* **C++** (Fewer names): `operator[]`, `at`, `front`, `back`
* **Rust** (More names, explicit): `[]` (via Index trait), `get`, `get_mut`, `first`, `first_mut`, `last`, `last_mut`

**Operation: Add an element**
* **C++:** `push_back`, `emplace_back`
* **Rust:** `push`, `insert`

**Operation: Remove an element**
* **C++:** `pop_back`, `erase`
* **Rust:** `pop`, `remove`, `swap_remove`

**Operation: Create an iterator**
* **C++** (Overloaded names): `begin`, `end` (with `const`, non-`const`, and reverse variants)
* **Rust** (Explicit names): `iter` (immutable borrow), `iter_mut` (mutable borrow), `into_iter` (take ownership)

**Operation: Change size**
* **C++** (Single method): `resize`
* **Rust** (Specific methods): `resize`, `resize_with`

**Operation: Remove elements by condition**
* **C++** (Algorithm + method): Use `std::remove_if` + `erase`
* **Rust** (Built-in methods): `retain`, `drain`, `drain_filter` (unstable)

**Operation: Append another collection**
* **C++** (Overloaded method): `insert` (with iterators)
* **Rust** (Specific methods): `append`, `extend`, `extend_from_slice`

**Operation: Handle errors on access**
* **C++** (Exception handling): `at` (throws an exception on error)
* **Rust** (Type-based handling): `get`, `get_mut` (return an `Option<&T>` type)

Permalänk
Medlem
Skrivet av jclr:

Den ständigt växande listan med intressanta saker man ska titta på nån gång i framtiden. Jag har knappt skrivit GUI kod i APL men det finns bindings för .Net så man kan skriva .Net / Windows Forms kod direkt i APL. Det finns även ⎕WC som också är win form baserat.

Har ingen windows, har inte .NET. Alla mina datorer kör Debian Linux. Har bara använt (inte kronolgisk ordning), VMS, TOPS-10, TOPS-20, UNIX, Linux (ett stort antal olika distributioner), MacOS (1-7), BSD. Men sedan 1994 bara Linux. Eftersom jag aldrig använt Windows är jag fullständigt korkad vad gäller allt Microsoft inklusive Windows. Hmm ... har hjälpt några grannar vid ett par tillfällen med deras problem med Windows och lyckades lösa deras problem genom att gissa mig fram. Funkade faktiskt men jag kände mig alltid bortkommen och korkad.

EDIT: IBM OS/360 har jag också använt, och på ett jobb även 370 (tror jag). Även SunOS och Solaris men den ena är ju en BSD och den andra en UNIX så de räknas kanske inte.

Visa signatur

Debian, bara Debian

Permalänk
Medlem
Skrivet av klk:

Bad AI göra en jämförelse mellan std::vector och rusts Vec.

Varför det? Det är ändå ingen som litar på svar från en AI. Ingen vettig person i alla fall.
Varenda gång du hänvisar till någon AI, så visar du bara att du inte vet svaret själv.

Permalänk
Medlem
Skrivet av Erik_T:

Varför det? Det är ändå ingen som litar på svar från en AI. Ingen vettig person i alla fall.
Varenda gång du hänvisar till någon AI, så visar du bara att du inte vet svaret själv.

Framförallt visar @klk AI-svar som är fel utan att själv upptäcka det vilket ger ytterligare bekräftelse att han är ute och cyklar.

Permalänk
Medlem
Skrivet av Erik_T:

Varför det? Det är ändå ingen som litar på svar från en AI. Ingen vettig person i alla fall.
Varenda gång du hänvisar till någon AI, så visar du bara att du inte vet svaret själv.

Var det ironi?

AI genererade en tabell med metoder mellan std::vector och rusts Vec, jag kan inte metoderna för rust (korrekt) men frågan handlade om överlagring

Permalänk
Skrivet av klk:

... frågan handlade om överlagring

Kan du inte använda den engelska termen så vi vet vad du pratar om? Operator overloading? Function overloading? Function overloading har ett antal specialfall i C++ med constructors, conversions, new/delete och const/volatile, men vi kan nog bunta ihop dem alla i function overloading. operator"" för literals, är det en conversion eller hamnar det under operator overloading? Att bara säga överlagring är lite luddigt...

Permalänk
Medlem
Skrivet av Ingetledigtnamn:

Kan du inte använda den engelska termen så vi vet vad du pratar om? Operator overloading? Function overloading? Function overloading har ett antal specialfall i C++ med constructors, conversions, new/delete och const/volatile, men vi kan nog bunta ihop dem alla i function overloading. operator"" för literals, är det en conversion eller hamnar det under operator overloading? Att bara säga överlagring är lite luddigt...

Ber om förståelse för det är svårt för mig och veta vad andra vill ha för typ av svar om frågorna är vagt specificerade.

Men det är egentligen att bunta ihop alltihopa.
C++ använder en teknik som kallas för name mangeling eller decoration, C++ kompilatorer gör det och det är så de kan lista ut vilken metod som skall köras. Kompilatorns namn på metoden är inte samma som namnet programmeraren valt för metoden utan oftast en kombination av namn och argument.

Teoretiskt skulle det kunna vara så att många av de "nyare" språken som påstår att de valt bort överlagra (väljer ordet överlagra för att representera all form överlagring) för att det skulle göra språken svårare, egentligen gjort det för att underlätta att skriva kompilatorer. Det förenklar arbetet med att skriva en kompilator om man slipper generera namn baserat på namn och typ.
Utvecklare som gillar att hitta på nya språk vill kanske inte spendera åratal på att skriva en kompilator

Gäller också att kunna sälja in språket till utvecklare. Den uppgiften är långt ifrån enkel. Det är så svårt så om det bara skulle vara ett ge

Osäker på följande
Samma med "templates" i de nyare språken. I C++ är templates mer en del av språket medan de nyare språken har valt en slags skriptlogik som liknar templates men de kör sitt "eget språk" för att producera funktionalitet. Den lösningen skulle kunna vara en nödlösning för att få till flexibilitet utan att kompilatorn måste bli allt för komplicerad