Struct - Unbekannte Größe eines Arrays - Was mache ich Falsch ?

Normalerweise wird bei solchen sehr kleinen Mikrocontrollern wie dem AVR mit sehr wenig RAM von dynamischen Speicher abgeraten. Das hat aber viel mit der Gefahr der Heap-Fragmentierung zu tun. Das trifft aber nicht immer zu. Wenn man z.B. dynamischen Speicher einmal anlegt und nicht mehr freigibt passiert nichts. Oder wenn man ihn wie bei dir anlegt und gleich danach wieder freigibt. Du hast auch nur maximal ein paar hundert Byte. Also spricht nicht unbedingt was dagegen.

Das kostet natürlich etwas Performance. Wie viel müsste man messen. Das kann ich so nicht sagen. Das gleiche gilt auch für die Abstraktion in einer Klasse. Ein völlig allgemeines Protokoll ist zwar sehr schön, aber auch nicht das effizienteste. Wenn du wirklich maximale Performance brauchst, schreibe es lieber auf genau deine Anwendung zugeschnitten.

Was aber auffällt, ist das der Kopiervorgang eigentlich überflüssig ist. Du kannst statt dessen einfach das struct auf einen byte* casten und wie ein Array behandeln. Dabei gilt aber das gleiche Problem mit der tiefen "Kopie" wie vorher! Du darfst nur bis zum Zeiger auf "payload" iterieren und musst dann über "payload" selbst getrennt iterieren, da dieses Array speicher-technisch nicht Teil des structs ist.

EDIT: genaugenommen musst du die Adresse des structs casten. Also &packet auf byte*:

byte* pPacket = (*byte)&packet;