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

5422 Ergebnisse

[0] ... [45] [46] [47] [48] [49] [50] [51] [52] [53] [54] ... [271]
  • [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.
  • [l] Felix Thu, 15 May 2025 22:05:48 GMT Nr. 156622
    ELF>@@�4@8@@@@���@@ee ���-�=�=HP�-�=�=��PPP@@���$$� � � S�tdPPP@@P�td   $$Q�tdR�td�-�=�=000GNU����GNUh�
    8Y�y�ۙ$ފ[n�d9J�/lib64/ld-linux-x86-64.so.2J "f u "__libc_start_main__cxa_finalizeprintflibc.so.6GLIBC_2.2.5GLIBC_2.34_ITM_deregisterTMCloneTable__gmon_start___ITM_registerTMCloneTable)ui 3���?�=0�=�@@�?�?�?�?�?@��H��H��/H��t��H����5�/�%�/@�%�/h�������1�I��^H��H���PTE1�1�H�=��[/�f.�H�=�/H��/H9�tH�>/H��t �����H�=q/H�5j/H)�H��H��?H��H�H��tH�
    /H��t��fD�����=-/u3UH�=�.H��t
    H�=/��.�c����/]�f.��ff.�@���g���UH��H��H�Ǹ������]���H��H���Hello, World!;  ���T,���<%���|zRx �����&D$4���� FJ w�?;*3$"\����A�C
    Z GNU0�) 
    X�=�=���o���
    � �?(h� ���o���o8���o���o(���o�=6@GCC: (GNU) 15.1.1 20250425�����= $�?:W � @s@zX��@� �@� � @�
    @&�@�
    9�@� "" test.c_DYNAMIC__GNU_EH_FRAME_HDR_GLOBAL_OFFSET_TABLE___libc_start_main@GLIBC_2.34_ITM_deregisterTMCloneTable_edata_finiprintf@GLIBC_2.2.5__data_start__gmon_start____dso_handle_IO_stdin_used_end__bss_startmain__TMC_END___ITM_registerTMCloneTable__cxa_finalize@GLIBC_2.2.5_init.symtab.strtab.shstrtab.note.gnu.property.note.gnu.build-id.interp.gnu.hash.dynsym.dynstr.gnu.version.gnu.version_r.rela.dyn.rela.plt.init.text.fini.rodata.eh_frame_hdr.eh_frame.note.ABI-tag.init_array.fini_array.dynamic.got.got.plt.data.bss.commentPP@.��$A��I���o��S ���[���c���o((p���o880hh��B((��   �@@�XX
    � �  $�8 8 |�� � ��=�-��=�-��=�-���?�/(��?�/ @0@0
    0080@ x2(�3
  • [l] Felix Thu, 15 May 2025 20:49:55 GMT Nr. 156619
    >>156428
    >einfach direkt die Strukturen aus dem Arbeitsspeicher wiederzuverwenden und auf die Platte zu schreiben.
    Also könnte ich hier theoretisch ein Binary ins feld pfrengen und auf dem servierer auf die Platte legen?
  • [l] Felix Thu, 15 May 2025 20:22:03 GMT Nr. 156618
    >>156441
    >Durch wiederholte Beleihung des ETFs bei der Depotbank? Nein, weil man nicht zu 100 % oder gar >100% beleihen kann. Konvergenz geometrische Reihe und so.
    Deine Behauptung war doch, dass Schulden+ETF besser ist als nur ETF und das die bösen Banken das leiderleider nicht erlauben. Nachdem dir erlärt wurde, dass sie das sehr wohl tun, müsstest du eigentlich loslaufen und ein maximal beliehenes Depot aufziehen, um noch mehr rauszuholen als ohne Kredit. Dass du dich das nicht traust, zeigt dass du nicht an deine eigenen Aussagen glaubst.
    >Es ist möglich, dass jemand seine Rendite sehen will, aber einfach nicht kriegt, weil das nicht der Marktpreis ist, der sich nach Angebot und Nachfrage bestimmt hat. Dann bleibt diese Person auf der Differenz sitzen.
    Ist richtig, aber es muss ja einen Grund dafür geben, dass bei konstanter Nachfrage ein anderes Unternehmen für dasselbe Produkt weniger Kapital benötigt und es deswegen günstiger anbieten kann. Wenn das der Fall ist, dann hat der unterlegene Investor sich einfach verzockt, so wie du dich bei einem ETF verzocken kannst, wenn du zum falschen Zeitpunkt kaufst oder verkaufst. Deswegen ist risikolose Rendite eine ganz andere Liga, denn da kannst du dich nicht verzocken.
    >Kreditzinsen ungewöhnlich niedrig
    Weiß nicht. Felix denkt eher, dass das das neue Normal ist. Einen Leitzins von 8,75% will außer den Banken niemand mehr haben.
    >>156553
    >"Eigenleistung"
    Passt nicht. Wer ein Haus kauft, aber nur Zinsen zahlt und nie tilgt, betreibt das Haus in Eigenleistung, zahlt aber dem Bankeigentümer fleißig seine Rendite.
  • [l] Felix Thu, 15 May 2025 19:14:07 GMT Nr. 156617
    >>156611
    Russland wird immer unser Feind sein. -> Aktionspotential liegt bei Russland.
    Russland wird für uns immer ein Feind sein. -> Aktionspotential liegt bei uns (DE/EU: wayne).
  • [l] Felix Thu, 15 May 2025 19:09:01 GMT Nr. 156616
    >>156609
    Google hat den Flash-Player ca. 9-11 Jahre lang angeboten.

    Google kauft YouTube: November 2006
    Erster HTML5-Player: April 2009
    HTML5-Player als Standard: Januar 2015
    Flash-Player entfernt: Juli 2017

    Fürs Ende von Flash darfst zum großen Teil einem gewissen Herrn aus Cupertino danken.
  • [l] Felix Thu, 15 May 2025 19:03:19 GMT Nr. 156614 SÄGE
    >>156612
    Alles klar, Zoomer!
  • [l] Felix ☎️ Thu, 15 May 2025 18:59:13 GMT Nr. 156613 SÄGE
    >>156485
    Ich dachte der Link geht zu Bang Boom Bang mit Ralf Richter
  • [l] Felix ☎️ Thu, 15 May 2025 18:58:06 GMT Nr. 156612
    >>156608
    >ARD und ZDF sind auch ohne Werbung kaum auszuhalten
    >Zum Glück gibt es MediathekView und Zapp
    Knapp vorbei zählt nur beim Boule.
  • [l] Felix Thu, 15 May 2025 18:23:52 GMT Nr. 156611
    >>156610
    >Trans
    Ich werde jetzt deine Identitätskrise nicht in Frage stellen. Aber er schrob explizit "Gefahr für unsere europäische Sicherheit", damit ist klar, dass Europa gemeint ist.


[0] ... [45] [46] [47] [48] [49] [50] [51] [52] [53] [54] ... [271]
[c] [meta] [fefe] [erp]