Sto provando a progettare il mio primo formato di file in ProtoBuf, e non sono sicuro quale sia la scelta migliore in alcuni casi, perché il layout di memoria/flusso non mi è completamente chiaro.Quanta memoria viene utilizzata dai campi "mancanti facoltativi"/"vuoti ripetuti" in ProtoBuf?
Così mi hanno di fatto molte domande, ma tutti strettamente collegati:
1) Che cosa significa un costo campo facoltativo, quando è omesso?
Penso che dovrebbe costare solo uno bit, poiché un campo di bit può essere utilizzato per contrassegnare i campi presenti/assenti, ma non lo so per certo. Potrebbero invece utilizzare un intero byte per campo opzionale.
2) Cosa costa un campo ripetuto quando è vuoto? È anche un bit, come il campo opzionale, o è "intestazione campo" + un byte (varint) per dire che è la dimensione 0?
3) Poiché "byte" ha implicitamente una dimensione, esiste effettivamente una differenza di dimensioni tra un campo byte facoltativo mancante e un campo byte vuoto richiesto?
[EDIT] Per "memoria" intendevo lo spazio utilizzato sul file system o sulla larghezza di banda della rete; Non intendevo la RAM, dato che dipendeva dal linguaggio di programmazione.
Ho letto la documentazione si è collegato al e non ho visto niente che esplicitamente detto che omette I campi 'opzionali' non vengono omessi sul filo. La documenazione afferma che "il messaggio codificato può avere o meno una coppia chiave-valore con quel numero di tag", che non suona come una garanzia. Puoi chiarire per favore? – Elpezmuerto
@Elpezmuerto https://developers.google.com/protocol-buffers/docs/encoding#optional - il punto chiave è "zero o più"; l'intero punto di "omesso" è che è il caso zero. Ed è proprio questo che consente la compatibilità diretta dei messaggi. Sì, lo scrittore * potrebbe * emettere i byte per il valore predefinito, ma non sarebbe "omesso" - avrebbe sicuramente un valore, e il ricevitore non sarebbe in grado di rilevare che era il valore omesso –