Aussehen
Suche Einloggen
[c] [meta] [fefe] [erp]

5256 Ergebnisse

[0] ... [67] [68] [69] [70] [71] [72] [73] [74] [75] [76] ... [262]
  • [l] Felix Fri, 16 May 2025 10:11:52 GMT Nr. 156644
    >>156638
    Anzeige wegen Antisemitismus ist raus.
  • [l] Felix Fri, 16 May 2025 09:42:14 GMT Nr. 156643
    >>156640
    Seine Reform war trotzdem das Dümmste (nicht unbedingt schlicht böse), was in diesem Jahrhundert ein Gesundheitsminister gemacht hat
  • [l] Felix Fri, 16 May 2025 09:41:19 GMT Nr. 156642
    >>156641
    Nein, das Sample, was in "Gangsta's Paradise" verwendet wurde ist aus den 70ern.
    Der Track von Coolio, der hier ganz offensichtlich parodiert wird, ist aus den 90ern.
  • [l] Felix Fri, 16 May 2025 09:33:55 GMT Nr. 156641
    >>156634
    Das Orginal ist von 1976.
  • [l] Felix Fri, 16 May 2025 09:30:57 GMT Nr. 156640
    >>156632
    >Zuletzt der Klabauterbach, weshalb dieser Felix von seiner Meinung "ein Minister sollte wenigstens irgendwas mit seiner Arbeit zu tun haben" auch nicht mehr so gänzlich überzeugt ist wie früher.
    Wobei der im Vergleich zu Spahn, Rösler oder gar Ulla Schmidt noch der Einäugige unter den Blinden war.
  • [l] Felix Fri, 16 May 2025 08:46:35 GMT Nr. 156639
    Ist es nicht die Aufgabe, eines Außenministers, geil zu finden, was die "Wirtschafttsleistung" wirklich erarbeitet.
    1. Es ist nur Feek-Geld
    2. Kannste nix machen
  • [l] Felix Fri, 16 May 2025 08:43:58 GMT Nr. 156638 SÄGE
    >>156577
    >>156581
    Dit sind allet die Globalisten! Wacht endliche auf!
  • [l] Felix Fri, 16 May 2025 08:34:26 GMT Nr. 156637
    JPG 640×480 60.5k
    Entweder, Gurgel meint, die paar Zuschauer mit uBlock sind die neue Elite für später wie Marsbesiedelung, Nach-EMP-Basteléxpärden ...

    Oder die anderen ohne uBlock sollten maximal fickiert werden. Tja, ishaltso. Wenn das Blocken nicht mehr ginge, würde Felix noch meer draußen sitzen (und trinken).
  • [l] Felix Fri, 16 May 2025 07:52:11 GMT Nr. 156636
    Darum hat Felix buchstäblich seinen Mailserver im Wohnzimer. Ein Raspberry mit 8 GB RAM reicht locker für Postfix und Dovecot.
  • [l] Felix Fri, 16 May 2025 07:31:37 GMT Nr. 156635
    >>156616
    Und der Tatsache, daß Adobe es nicht geschafft hat, den Mist auf AMD64 zu portieren und die Browser i386 fallen ließen.
  • [l] Felix Fri, 16 May 2025 06:41:55 GMT Nr. 156634
    Was Felix während des Videos klar geworden ist: Der Typ ist doch auch erst in seinen 50ern. Das heißt, vor 30 Jahren, als der Song rauskam, war der in seinen 20ern.
  • [l] Felix Fri, 16 May 2025 06:30:40 GMT Nr. 156633
    >>156542
    Hahaha oh wow Fefe, mach doch einfach mal Urlaub, die Pfrengerei ist echt nicht gesund
  • [l] Felix Fri, 16 May 2025 06:28:53 GMT Nr. 156632
    >>156555
    Zuletzt der Klabauterbach, weshalb dieser Felix von seiner Meinung "ein Minister sollte wenigstens irgendwas mit seiner Arbeit zu tun haben" auch nicht mehr so gänzlich überzeugt ist wie früher. Aber das liegt wohl eher in der Natur der Politikerkaste begründet als in dem Grundsatz.
  • [l] Felix Fri, 16 May 2025 01:15:43 GMT Nr. 156631
    >>156626
    >
    ((struct Base*)&arr[i])

    >Dazu die C-Anmerkung: Ohne union darf man das nicht, denn die "common initial sequence" für Zeiger auf Objekte, die nicht mit den zugrundeliegenden Objekt übereinstimmen, gilt nur für unions. Darüber hinaus verstößt es gegen die strict-aliasing-Rule, da man nun für arr[i] zwei Objekte (eines nur temporär) unterschiedlichen Typs hat, womit man nicht mehr mittels * oder -> dereferenzieren darf, wie im Kot gemacht.
    Felix ist sich zu 99% sicher, dass genau für diesen Anwendungsfall im C-Standard für structs eine Ausnahme existiert. Aber frag Felix nicht, wo das steht. Wenn das nicht ginge, dann wäre auch so ziemlich alles von GObject bis Linux-Kernel kaputt.

    >Und da wäre ein Standardbeispiel eine Konvolution, z.B. einen Weichzeichnungsfilter über ein Bild. Wenn diff zwei Parameter bekommt, soll man dann für einen 5x5-Filter 25 Parameter übergeben?
    Und wie oft berechnest du eine Konvolution über ein Bild, in dem jedes Pixel einen anderen polymorphen Typ hat? Das ist völlig an den Haaren herbeigezogen.

    >>Arrays von Pointern als Argument an eine Funktion zu übergeben ist etwas, das bei Felix in der Praxis eigentlich nie vorkommt. Wenn dann nur, weil er es mit einer absolut beschissenen API zu tun hat.
    >Wut? Arrays übergeben zu bekommen ist der absolute Standardfall, und gerade so explizit gewollt. Öffnest du eine Datei und kriegst du beim Lesen ein einzelnes Byte zurück? Nö, du übergibst ein Array, und das wird dann gefüllt.
    Array von Pointern. Nicht Arrays allgemein. Auch nicht Pointer zu Arrays. Arrays von Pointern.

    >>Stell dir vor, der Compiler ist schlau genug, das zu inlinen.
    >Stell dir vor, der Compiler macht es nicht, weil er es nicht durchschaut (vgl. Video unten, wo es nicht geinlined wurde).
    Welches Video? Probier es doch selbst aus. Gib es bei Godbolt ein und kompiliere mit mindestens O1. Ich fresse meinen Besen, wenn der Compiler das nicht inlined.

    Hab ich gesagt, dass der Compiler alles immer inlined? Nein. Das wäre auch gar nicht wünschenswert. Hab ich gesagt, dass du dir eine neun schichten Tiefe Template-Abstraktionsfabrik bauen kannst und dann immer noch alles geinlined wird und es "0 cost ist"? Nein, aber das ist auch ein komplettes Strohmannargument. Das hier wird geinlined.

    >Dann heißt es mal wieder: ""Clean" Code, Horrible Performance" (das Video ist auch bekannt, nimmt Felix an).
    Warum lutscht du Casey Muratori nicht einfach eindlich die Pene, wenn du es so dringend willst, denn darauf laufen all deine Textwände ja letztlich hinaus.

    Felix kann dieses MÖchtegern-1337-Indie-Entwickler-Kreisgewichse eh nicht mehr hören.
    <HURR ich lade eine Million Dreiecke mit EINEM Systemaufruf in den RAM meiner 10k NG teueren GPU und dann rendert die GPU das mit 1000 Frames pro Sekunde!!!
    <Ich bin ja so klever!!! Warum sind nicht alle so genial wie ich? Warum ist andere Software langsam? Dreiecke an die GPU hochladen ist das KOMPLEXESTE Problem der Welt. Achja und Octrees, einen Octree-Fetisch haben sie auch alle. Die komplexeste Datenstruktur der Welt. Nur supergeniale Spieleprogrammierer können die verstehen. Und Voxel. Jeder muss seine eigene scheiß Voxelengine programmieren. Es ist ja so originell, hat noch nie jemand gemacht. Blabla...
  • [l] Felix Fri, 16 May 2025 00:22:55 GMT Nr. 156629
    JPG 4210×2805 2.6M
    >>156517
    >Name
    ja
    >Geburtsdatum
    nein
    >Anschrift
    ja
    >und so was
    Unterschrift mit Datum, glaub ich.

    >auf dem Vorplatz des Hamburer Hauptbahnhofs öffentlich aufgeknüpft werden werden
    Beim Pissoir oder bei der Bahnhofsmission? Das wäre es mir wert.

    Allerdings ist mir nicht bekannt, ob die in den KZ gesammelten persönlichen Daten von wildfremden radikalisierten Werbefeinden archiviert werden oder so, und wer sie auf Gültigkeit geprüft und sie gezählt hat.
  • [l] Felix ☎️ Fri, 16 May 2025 00:16:33 GMT Nr. 156628
    Adblocker regelt.
  • [l] Felix Thu, 15 May 2025 23:52:16 GMT Nr. 156627
    (Fortsetzung)

    >Wenn deine "Klasse" z.B. eine VTable hat, dann könntest du darin die größe Speichern.
    Ja. Bei den Beispielen oben fehlt auch noch der enum, mit dem man den Typ eines Elements im Array (insbesondere als union) unterscheiden kann, als alternative zur VTable.
    >Oder du gibst deinem Struct ein zusätzliches Element, das die Größe angibt.
    Dass man den Pointer durch einen Offset ersetzt hat, der einem anzeigt, wo man das nächste Element finden kann, macht es nicht besser. Ist halt nicht mehr "kontinuierlich", behindert wahlfreien Zugriff. Wäre außerdem in der for-Schleife eine serielle Abhängigkeit und verhindert OoOE.

    >0. Fast immer wenn man über eine Liste/Array von irgendwas iteriert, macht man eine Sache pro Element.
    >1. Falls man doch etwas mit mehreren Elementen machen muss, dann ist die Lösung ganz einfach: Man gibt der Funktion mehrere Argumente.
    Ne, Felix macht viele Sachen mit Grafik (deswegen kennt Felix auch die Lösung, wie bei dir, mit explizit übergebenem Pitch, wobei dieser ggf. auch ein ganzer Zeilen-Pitch ist, das dann aber hauptsächlich fürs Alignment).

    Und da wäre ein Standardbeispiel eine Konvolution, z.B. einen Weichzeichnungsfilter über ein Bild. Wenn diff zwei Parameter bekommt, soll man dann für einen 5x5-Filter 25 Parameter übergeben?

    Wenn es un-mathematischer sein soll: Sortieren, Mustersuche (mit variabel langem Muster/Regex), geordnetes Zusammenfügen zweier Arrays (wie bei Mergesort), Zusammenfügen im Reißverschlussverfahren von zwei Arrays ("zip"), Element entfernen, Duplikate entfernen, bestimmte Elemente duplizieren, Umordnen (z.B. Elemente bestimmten Typs ans Ende verschieben), Shiften eines Arrays um n Stellen mit Wraparound (braucht idR temporären Speicher), Array splitten. Da kommt man mit elementweisen Operationen nicht weit und will auf den ganzen Arrays arbeiten.

    Ganz davon abgesehen (ohne jetzt zum DOD-Evangelisten zu werden), haben die DODler gerade erkannt, dass das "man macht eine for-Schleife und ruft eine Funkton auf, die genau ein Element kriegt" genau das ist, was man nicht machen sollte.

    Siehe dazu genau das hier:
    https://www.youtube.com/watch?v=rX0ItVEVjHc&t=1919s
    Insbesondere sorgt die Übergabe als Array auch dafür, dass man so Flags von Elementen aus der Schleife rausheben kann. Der Kompiler ist halt zu doof.

    >Arrays von Pointern als Argument an eine Funktion zu übergeben ist etwas, das bei Felix in der Praxis eigentlich nie vorkommt. Wenn dann nur, weil er es mit einer absolut beschissenen API zu tun hat.
    Wut? Arrays übergeben zu bekommen ist der absolute Standardfall, und gerade so explizit gewollt. Öffnest du eine Datei und kriegst du beim Lesen ein einzelnes Byte zurück? Nö, du übergibst ein Array, und das wird dann gefüllt.

    Bereits letzteres (also das _Array_) wurde als "Get a byte, get a byte, get a byte, byte, byte" von Dave Cutler kritisiert, aber wenn man nur ein einziges Element zurück bekäme, wäre das Betriebssystem-Interface so karpott, dass man keine performanten Programme mit Datei-Zugriff auf dem Betriebssystem mehr hinkriegen würde.
    Vollständigen Text anzeigen
  • [l] Felix Thu, 15 May 2025 23:51:35 GMT Nr. 156626
    (Fortsetzung)

    Die C++-Template-Variante gegen die Kot-Explosion sähe so aus:
    template <typename T>
    int diff(T * arr, size_t n)
    {
    	int result = 0;
    
    	for(size_t i = 0; i < n - 1; i++)
    		result += arr[i+1].member1 - arr[i].member1;
    
    	return result;
    }

    Probleme beim C++-Template-Gedönse gibts natürlich, wenn z.B. Derived1 und Derived2 jeweils einen Member member4 hätten, mit jeweils unterschiedlichem Typ. Dann kann man mit dem union das auseinanderhalten, muss aber einen auf die Klasse getemplateten Getter für member4 schreiben.

    Das sind, wie gesagt, Varianten gegen die _Kot-Explosion_. Die zugrundliegende Datenstruktur sieht bei allen gleich aus.

    Nun zu den drei Code-Beispielen.

    >[1. Code-Beispiel]
    >
    ((struct Base*)&arr[i])

    Dazu die C-Anmerkung: Ohne union darf man das nicht, denn die "common initial sequence" für Zeiger auf Objekte, die nicht mit den zugrundeliegenden Objekt übereinstimmen, gilt nur für unions. Darüber hinaus verstößt es gegen die strict-aliasing-Rule, da man nun für arr[i] zwei Objekte (eines nur temporär) unterschiedlichen Typs hat, womit man nicht mehr mittels * oder -> dereferenzieren darf, wie im Kot gemacht. Du hast aber gesagt, dass das nur Beispielcode für eine mögliche Umsetzung sein soll, deshalb hackt Felix darauf nicht weiter rum.

    >Also in deinem Fall wäre die naheliegenste Lösung folgende gewesen:
    Das klappt in dem einfachen Beispiel gut. Aber: Sobald die for-Schleife nicht mehr in der gleichen Funktion wie die Array-Definition liegt, läuft man wieder in den Fall wie oben rein. Damit wurde das Problem nur verschoben.

    Und in einen solchen Fall kann man schnell kommen. Kaum macht man um die Schleife drumrum etwas Komplexeres, oder man will an einer anderen Stelle die gleiche Berechnung durchführen, refaktorisiert man die Schleife raus in eine Funktion. Dann muss man sich bereits fragen, welchen Parameter diese Funktion kriegen soll. Base *? Dann kann der Benutzer kein Derived1-Array übergeben. Derived1 *? Was ist, wenn der Benutzer aber ein Derived2-Array hat? Man ist wieder an der gleichen Stelle wie zuvor.

    Der Aufrufer, der auch schon mal viele Ebenen drüber im Callstack stehen kann, muss dann wissen und mitteilen, welcher Typ ganz unten im Callstack, in der innersten Berechnungsschleife, zu verwenden sein soll. Das wurde in deinem zweiten Kot-Beispiel auch erkannt: Die Information, die man mein Array-Iterieren über den Typ braucht, nämlich die Größe, wird mit member_size runtergereicht.

    Das Problem, nämlich das Runterreichen der Information, ist leider auch genau das, was je nach Lösung zur Kot-Explosion führt.
    Vollständigen Text anzeigen
  • [l] Felix Thu, 15 May 2025 23:51:03 GMT Nr. 156625
    >>155236
    Felix hat sich wieder an den Faden erinnert.
    Erst mal Danke, sehr guter Pfosten.

    >Sieht auf den ersten Blick so aus, als hättest du da im Wesentlichen eine union aus beiden Typen gebildet
    Das ist korrekt.

    >Kann man natürlich machen, aber das Problem ist, dass man dann vorab wissen muss, wie groß der größte abgeleitete Typ ist
    Genau, d.h. zur Kompilierzeit bekannt.

    >und dann alle (Arrays aus) Basistypen die maximale Größe haben
    Genau das hat doch Felix bedacht und genau da hat Felix geschrieben:
    >
    (es sei denn, der Benutzer spezifiziert, dass er das nicht möchte, z.B. für ein Array von Base).

    Ein nicht-polymorphes Array von Base kann man natürlich trotzdem anlegen, muss diesen Wunsch aber z.B. durch Sprachschlüsselwort spezifizieren. Oder man macht es andersherum, und spezifiert polymorphe Arrays durch Sprachschlüsselwort. Man hat eben die volle Auswahl, und kann sich seine Cache-Line-kompakten Arrays erstellen. Was natürlich nicht geht: Ein polymorphes Array haben, das zur Laufzeit nur mit Base befüllen, und dann erwarten, dass da kein Padding ist (was aber Vorteile für den Schreibzugriff und die Iteration bringt, siehe unten).

    >Dein Problem ist, dass du einfach nicht unterscheiden kannst zwischen der abstrakten Repräsentation und der tatsächlichen Allokation der Daten im Speicher.
    Schauen wir doch mal, was der C- und C++-Standard mit ihrer "abstrakten Maschine" zur Datenstruktur "Array" so schreibt:
    >An array type describes a contiguously allocated nonempty set of objects
    Also so ziemlich das, was Felix in >>155040 mit "kontinuierlich allozierter Speicher" geschrieben hat. Es darf insbesondere kein Padding zwischen den Elementen geben, aber jedes Element darf (auch am Ende) Padding haben. Und natürlich darf man und will man gerade einschränken, wie das dann im Speicher landet (beim C-Standard auf der abstrakten Maschine, bei einer C-Implementierung auf einer konkreten Plattform). Ein Array ist nicht nur Luft&Liebe mit einem Subskript-Operator, und die Daten dürfen irgendwo im Speicher fliegen. Ein "du darfst nicht sagen, wie die Datenstruktur im Speicher liegt" wäre da komplett sinnlos, zumindest die Leitplanken, wie das im Speicher liegt, muss man geben können.
    Und zu structs und unions wird übrigens geschrieben:
    >As discussed in 6.2.5, a structure is a type consisting of a sequence of members, whose storage is allocated in an ordered sequence, and a union is a type consisting of a sequence of members whose storage overlap.

    Natürlich darf man, wenn man eine Datenstruktur definiert, zumindest grundlegende Annahmen über die Plattform machen (und sei es im C-Standard nur für eine abstrakte Maschine), z.B. dass diese "Speicher" hat. Das hat man bereits auf einer Turing-Maschine, wenn man definiert, wie die Ausgabe auf dem Band zu liegen hat. Das ist keine "fehlende Unterscheidung", das ist Teil der Definition, wie die Datenstruktur am Ende aussehen soll, und ja, das schließt die Leitplanken fürs Speicherlayout mit ein. Und wenn man jetzt sagt:
    Vollständigen Text anzeigen
  • [l] Felix Thu, 15 May 2025 22:32:10 GMT Nr. 156624
    >>156619
    >>156622
    Joa, theoretisch schon, aber das liegt dann halt irgendwo in der Mitte von einer größeren Datei, die außerdem nicht ausführbar ist. Wir setzten hier ja kein Schlangenöl ein, das bei so einer "Gefahr" die ganze Datei gleich in die "Quarantäne" schiebt.


[0] ... [67] [68] [69] [70] [71] [72] [73] [74] [75] [76] ... [262]
[c] [meta] [fefe] [erp]