Ich schaute auf einige C++ - Netzwerkcode. Als ich ging, um herauszufinden, wie groß der Puffer war, fand ich etwas wie folgt aus:Verwenden Sie bitweise oder anstelle von std :: max für die Puffergröße
static const uint32_t MAX_COMMAND_BUFFER =
sizeof(struct S1) | sizeof(struct S2) | sizeof(struct S3) |
sizeof(struct S4) | sizeof(struct S5) | sizeof(struct S6);
Ich glaube, hier die Grundidee ist, dass der Puffer eine dieser 6 structs enthalten. Dies ist in einem äußeren Bereich deklariert, so dass es für Dinge wie einen späteren äußeren Umfang uint8_t
Array-Größe verfügbar ist.
Jetzt normalerweise würde ich erwarten, etwas zu sehen, entweder mit der std :: max() -Funktion, oder der tertiary-Operator, um die genaue Größe der größten dieser 6 Strukturen zu berechnen. Ich habe die obige Redewendung nie zuvor gesehen und musste aufhören, mich selbst zu überzeugen, dass es funktionieren würde.
Da ich also neu bin, möchte ich im Allgemeinen wissen, wie gültig das ist und welche Vor- und Nachteile es hat.
Was kann ich sehen, ist -
pro:
- Es sollten Sie immer mindestens so groß wie Ihre größte struct Größe eine Größe geben. Was ist alles, was Sie wirklich brauchen, wenn der Platz nicht zu hoch ist?
- Es scheint zur Kompilierzeit kalkulierbar zu sein.
- Es sollte sogar mit sehr alten C++ (oder sogar C) Compiler funktionieren.
con:
- Es kann die Größe fast doppelt so groß wie nötig machen.
- Es macht es viel schwieriger für einen Menschen offline herauszufinden, genau wie groß der Puffer ist.
- Es ist seltsam/unerwartet.
Je nachdem, für welchen Compiler der Code geschrieben wurde, könnte es sich um eine Optimierung gehandelt haben, zumal der Compiler (wie Sie gesagt haben) das Ganze zur Kompilierzeit berechnen kann. – refi64