惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Google DeepMind News
Google DeepMind News
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
Security Latest
Security Latest
P
Palo Alto Networks Blog
AWS News Blog
AWS News Blog
NISL@THU
NISL@THU
T
Threatpost
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Latest news
Latest news
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
WordPress大学
WordPress大学
J
Java Code Geeks
P
Privacy International News Feed
阮一峰的网络日志
阮一峰的网络日志
S
Schneier on Security
博客园 - 聂微东
Project Zero
Project Zero
美团技术团队
Recent Commits to openclaw:main
Recent Commits to openclaw:main
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Scott Helme
Scott Helme
I
Intezer
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
H
Hacker News: Front Page
S
Security @ Cisco Blogs
博客园 - 司徒正美
O
OpenAI News
Last Week in AI
Last Week in AI
L
LINUX DO - 热门话题
酷 壳 – CoolShell
酷 壳 – CoolShell
SecWiki News
SecWiki News
月光博客
月光博客
S
Security Affairs
The GitHub Blog
The GitHub Blog
P
Privacy & Cybersecurity Law Blog
S
Secure Thoughts
V
V2EX
S
Securelist
F
Fortinet All Blogs
W
WeLiveSecurity
D
Docker
博客园 - 三生石上(FineUI控件)
Simon Willison's Weblog
Simon Willison's Weblog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
C
Cyber Attacks, Cyber Crime and Cyber Security
V
Visual Studio Blog
www.infosecurity-magazine.com
www.infosecurity-magazine.com
Webroot Blog
Webroot Blog
Engineering at Meta
Engineering at Meta

heise online News

Machine Learning mit Python – KI und Deep Learning in 5 Sessions erklärt Porsche-Chef Leiters plant umfassenden Konzernumbau Studie: KI bleibt oft im Testlauf stecken iX-Workshop: Grundlagen und Prinzipien eines modernen IT-Managements Missing Link: Aus für De-Mail – warum das „@“ das eingekringelte „e“ besiegte Top 10: Android Auto & Carplay nachrüsten – das beste Display fürs Auto im Test BOS-Funk: ETSI standardisiert Funk für Behörden Repair-Cafés jubeln: Bundestag beschließt Ökodesign-Reform für Nachhaltigkeit Google wehrt sich gegen Monopol-Urteil CERN-Rat beschließt Strategie-Update: FCC-ee soll LHC-Nachfolger werden Product Owner AI Day 2026: Konferenz und Workshop für KI im Produktmanagement Taskforce sieht keine Knappheit bei Kerosin Aus dem Weg! E-Scooter Navee UT5 Max mit Kuhfänger und brachialer Power im Test Krankenhaus-IT: Geldmangel und schlechte Prozesse gefährden Digitalisierung „The Boroughs“: Opa entdeckt Stranger Things iX-Workshop: Lokales Active Directory gegen Angriffe absichern Google Pics und Tiger-Selfies – die Fotonews der Woche 21/2025 Fitbit-App bekommt großes Update auf Version 5.0 und heißt jetzt Google Health Zwischen Wellen, Weite und Wissenschaft: Die Bilder der Woche 21 Sonnenenergie effizient speichern und nutzen | c’t uplink Cyberangriff auf Abrechnungsdienstleister betrifft viele Kliniken Lizenzstreit und Cloud-Zwang: Bambu Lab unter massivem Druck Vom Postweg ins BundID-Konto: Bundestag stimmt für digitales Führungszeugnis Windows 11 ist ein kompletter Verkehrsunfall Europol legt VPN-Dienst lahm TV-Deals zur WM: Die besten Fernseher von OLED bis XXL zum Tiefstpreis Nvidia will mit Vera-Prozessoren nach der CPU-Krone greifen Googles XR-Brillen auf der I/O: Project Aura & Prototyp ausprobiert Proxmox VE 9.2 mit Dynamic Load Balancer und Linux Kernel 7.0 Großstadt blockiert Überwachungssoftware Palantir Gelöscht und doch nicht weg: Signal speichert Nachrichten länger als erwartet SADAS: Neue Software warnt Fahrer vor Gefahrenzonen im Straßenraum Drei Fragen und Antworten: Wann sich KI-Coding wirklich rechnet Metas KI-Brillen helfen Blinden im Alltag – und werfen neue Fragen auf Fotoanbieter Portraitbox: Erpressung nach Sicherheitsvorfall? KI-Update: Google I/O-Fazit, Anthropic, Nvidia, Gehirn und KI-Parallelen Avatare und Augmented Reality: Apple schnappt sich kleines Start-up Won’t fix! – Teil 1: Warum Softwareschätzungen so zuverlässig falsch sind Virtual OS Museum: Über 1700 alte Betriebssysteme in einer VM Navee XT5 Max Test: Brachialer E-Scooter mit 2200 Watt ist Outdoor-Testsieger Airbnb personalisiert App mit KI IT-Ausfälle immer teurer für große Unternehmen Betrug im App Store: Apple stoppt laut eigenen Angaben Milliarden-Verluste TGIQF: Das Quiz rund um Hubschrauber Verbraucherschützer fordern Schadensersatz für Nutzer bei Smart-Meter-Problemen Citroën kündigt Elektroauto mit dem Namen „2CV“ an Software Testing: So ändert Agentic Engineering die Softwareentwicklung Post zum Freitag: Clever durch den Urlaub – schlauer reisen, entspannter surfen iX-Workshop: Sicherer Betrieb von Windows 11 im Unternehmen Camunda: ProcessOS optimiert Geschäftsprozesse mit KI macOS kann bald barrierefreien Sony-Access-Controller nutzen Elektro-Sportenduro Radian EXR vorgestellt: Viel Kraft aus Wechselakkus Voice Control in iOS 27: Accessibility-Feature sagt Siri-App-Steuerung voraus Stellantis stellt neue Plattform für neuen Strategieplan vor Spotify: Neue Desktop-App erstellt personalisierte KI-Podcasts Zum Jahresende: Bundestag beschließt Ende der De-Mail Bluesky: Russische Akteure kapern angeblich Accounts und verbreiten Propaganda Dell PowerEdge: Bis zu 70 Prozent mehr Leistung für Rechenzentren Forscher nutzen Vakuumprozess zur Herstellung von effizienten Tandemsolarzellen Jubiläum: Apple Retail Stores seit 25 Jahren im Geschäft Spotify kündigt KI-generierte Remixe und Podcasts an IT Summit 2026: heise-Konferenz zu Digitaler Souveränität „Helldivers 2“: DLSS 4.5, FSR 4 und XeSS 3.0 kommen am 27. Mai Passend zur Fußball-WM: Apple verbessert Sports-App „Gemini built in“: Google bietet Referenzdesigns für Smart-Home-Geräte an Neu in .NET 10.0 [24]: LINQ-Operatoren RightJoin() und LeftJoin() in EF Core Drei „Tomb Raider“-Klassiker im Epic Games Store kostenlos Apache-Airflow-Komponenten: Angreifer können Datenbank modifizieren Notepad++: Update bessert Schwachstelle im Installer aus Halbleiter-Ökosystem: Studie beschreibt EU-Problemzonen Stellantis-Umbau: Fokus auf Kernmarken und Kapazitätsabbau in Europa Cisco stopft Sicherheitsleck mit Höchstwertung in Secure Workload „GTA 6“ erscheint wie geplant am 19. November Samsung: Abstimmung über Boni von Hunderttausenden Euro pro Mitarbeiter Vier Arme sind besser als zwei: Humanoider Roboter für die Schwerelosigkeit Kopfhörer mit KI-Chip made in Germany: Soundcore Liberty 5 Pro ausprobiert iX-Workshop: Sicheres Active Directory – Adminrechte mit Tiering schützen Destiny-Ära endet: Bungie beendet Entwicklung von „Destiny 2" Riesenrakete Starship: SpaceX hat den nächsten Testflug erneut verschoben Trend Micro Apex One und Langflow: Warnung vor Angriffen Kann WhatsApp verschlüsselte Nachrichten einsehen? Texas reicht Klage ein Passiv-PC Arctic senza AI 370 im Test: Schnell, lautlos, unsichtbar Warhammer Skulls 2026: Die volle Ladung „Warhammer“-Videospiele Freitag: Robotaxi-Probleme in den USA, Australiens Kinderschutz-Strafe gegen X Vorsicht, Kunde! – Wenn der Gutschein plötzlich wertlos wird Waymo stoppt Autobahnfahrten und Robotaxi-Dienste in Städten mit Starkregen Privacy Guardrail: Chrome-Erweiterung will sensible Daten vor Chatbots schützen Mit dem Deutschland-Stack samt Zertifizierung zur digitalen Souveränität X kooperierte nicht mit Behörde: Höhere Strafe in Australien GMX bringt KI ins Postfach: Wir haben den Assistenten ausprobiert Digitale Souveränität: OpenDesk laut Studie keine volle Microsoft-Alternative Digitale Souveränität: Bund vergibt 250-Millionen-KI-Cloud-Auftrag Kupfer-Glas-Migration: „Homes connected macht keinen Sinn“ Teure Kultur: Justizministerin Hubig kündigt Kampf gegen Ticketwucher an Top 10: Der beste Wireless Charger mit Qi2 im Test – Magsafe-Ladegerät für alle AMDs offizieller Mini-PC kostet 3999 US-Dollar WordPress: Offizielles Plug-in bindet Blogs direkt ins Bluesky-Protokoll ein KI beweist: Mathematiker lagen falsch re:publica: Große Fragen, kaum Antworten Fritz Labor 8.40 bereitet Fritzboxen auf Matter vor
C++26-Reflexion zur Kompilierungszeit
heise online · 2026-06-02 · via heise online News

Im heutigen Beitrag meines C++-Blogs möchte ich auf die statische Reflexion in C++26 eingehen. Einer der großen Vorteile von Reflexion ist, dass wir die neue Funktion bereits ausprobieren können, da mit Clang ein Compiler verfügbar ist, der alle Facetten implementiert. Und auch der jüngst erschienene GCC 16 implementiert das Feature bereits.

Portrait von Andreas Fertig

Andreas Fertig ist erfahrener C++-Trainer und Berater, der weltweit Präsenz- sowie Remote-Kurse anbietet. Er engagiert sich im C++-Standardisierungskomitee und spricht regelmäßig auf internationalen Konferenzen. Mit C++ Insights (https://cppinsights.io) hat er ein international anerkanntes Tool entwickelt, das C++-Programmierenden hilft, C++ noch besser zu verstehen.

Anhand meiner typischen Anwendungsfälle habe ich untersucht, welche Aufgaben sich mit Reflexion besser lösen lassen. Eine Aufgabe, die mich den größten Teil meiner Karriere beschäftigt hat, war das Lesen und Schreiben von Daten, die über eine Netzwerkverbindung kamen. Die Definition von „Netzwerk“ war zu verschiedenen Zeiten unterschiedlich. Gemeinsam war jedoch, dass alles, was gesendet wurde, in Netzwerk-Byte-Reihenfolge (Big-Endian) verschickt wurde, und alles, was empfangen wurde, ebenfalls in Netzwerk-Byte-Reihenfolge ankam. Für manche Systeme machte das keinen Unterschied, da sie bereits Big-Endian-Maschinen waren. Aber nicht immer. Vor allem ARM setzte auf Little-Endian. Bei einem Teil der Systeme mussten die Daten beim Empfangen oder Senden daher byteweise vertauscht werden.

Das Problem hier (war), wie tauscht man die Daten? Jeder Datentyp, der größer als ein Byte ist, muss jedes Mal getauscht werden. C++23 hat uns std::byteswap gegeben, wodurch POSIX-Funktionen wie htons überflüssig geworden sind. Das bedeutet zumindest eine Verbesserung im Hinblick auf Sicherheit.

Fangen wir mit einem Beispiel an. Der folgende Code zeigt die Datenstrukturen, die ich heute verwende.

enum class Color16 : uint16_t
{
};

struct RGB48 {
  Color16 red;
  Color16 green;
  Color16 blue;

  auto operator<=>(const RGB48&) const = default;
};

struct LEDState {
  bool  state;
  RGB48 rgbColor;

  auto operator<=>(const LEDState&) const = default;
};

struct LEDStateMessage {
  uint32_t messageId;
  LEDState state;

  auto operator<=>(const LEDStateMessage&) const = default;
};

Wie du sehen kannst, ist die letzte Struktur LEDStateMessage später die Wurzel. Diese Struktur enthält eine Struktur, die wiederum eine Struktur enthält. Wir gehen es heute also rekursiv an.

Alle structs verfügen über einen Dreiwege-Vergleichsoperator – das erleichtert die Überprüfung.

Was ich erreichen möchte, sieht in etwa so aus:

LEDStateMessage msg{.messageId = 3,
                    .state{.state = true,
                           .rgbColor{.red   = Color16{0x5u},
                                     .green = Color16{0x28u},
                                     .blue  = Color16{0x40u}}}};

Serialize(msg);

Die Daten sollten ausgetauscht oder besser noch an Ort und Stelle serialisiert werden. Ich gehe von einem System mit Speicherbeschränkungen aus, bei dem ich es mir nicht leisten kann, doppelt so viel Speicher zu verbrauchen.

Denke jetzt mal einen Moment darüber nach, wie viel Mühe du dir in der Vergangenheit gegeben hast, damit Serialize funktioniert. Ich für meinen Teil kann sagen, dass es mich viele Stunden gekostet hat.

Bist du bereit? Okay, hier kommt es:

template<typename T>
requires(not std::is_pointer_v<T>) and std::is_trivially_copyable_v<T>
constexpr void Serialize(T& data)
{
  if constexpr(std::is_array_v<T>) {  // #A
    for(int i{}; i < std::size(data); ++i) { Serialize(data[i]); }

  } else if constexpr(std::is_enum_v<T>) {  // #B
    data = static_cast<T>(std::byteswap(std::to_underlying(data)));

  } else if constexpr(not std::is_class_v<T>) {  // #C
    data = std::byteswap(data);

  } else {  // #D
    static constexpr auto members =
      std::define_static_array(std::meta::nonstatic_data_members_of(
        ^^T, std::meta::access_context::current()));

    template for(constexpr auto& mem : members) { Serialize(data.[:mem:]); }
  }
}

Die Implementierung von Serialize besteht aus vier Teilen. In Abschnitt #A prüft Serialize, ob es sich um ein Array handelt. Wenn der Datentyp passt, ruft die Implementierung Serialize für jedes Element des Arrays auf.

Als Nächstes prüft die Implementierung in #B, ob der Datentyp ein enum ist. In diesem Fall wird C++23s std::to_underlying zusammen mit std::byteswap verwendet, um die Bytes tatsächlich zu vertauschen.

Nun wird in #C, falls dieser Datentyp kein Klassentyp ist, std::byteswap auf die Daten angewendet.

So weit, so gut. Bisher ist das alles generischer Code, den du schon vor C++26 so schreiben konntest. Der knifflige Teil sind die Datenelemente von Klassentypen. Genau das wird in #D behandelt.

Dank der Reflexion-Fähigkeiten durchläuft die Implementierung alle Datenelemente der Klasse und ruft für jedes davon Serialize auf. Et voilà, ein hervorragender erster Entwurf einer generischen Serialisierungsfunktion.

(map)