私はProtoBufで最初のファイル形式を設計しようとしていますが、メモリー/ストリームのレイアウトが完全にわからないため、何が最良の選択であるかわかりません。 ProtoBufの "missing optional"/"empty repeated"フィールドでどのくらいのメモリが使用されていますか?
は、だから私は実際にいくつかの質問を持っていますが、すべての密接に関連:1)それが省略されているオプションフィールドのコストを、何?
ビットフィールドを使用して存在/不在フィールドのフラグを立てることができるため、ビットと計算されますが、わかりません。代わりに、オプションのフィールドごとにバイト全体を使用することもできます。
2)フィールドが空の場合、繰り返しフィールドコストはいくらですか?オプションフィールドのように1ビットですか、それとも "フィールドヘッダー" + 1(varint)バイトでサイズ0ですか?
3) "bytes"は暗黙的にサイズを持っているので、欠けているオプションのバイトフィールドと空の必須バイトフィールドの間に実際にサイズの違いがありますか?
[編集]「メモリ」とは、ファイルシステムまたはネットワークの帯域幅に使用されるスペースを意味します。 RAMを意味するわけではありません。プログラミング言語に依存するからです。
私はあなたがにリンクされているドキュメントを読んで、明示的に省略することを言った何も表示されませんでした'optional'フィールドはワイヤー上で省略されません。ドキュメンテーションでは、「エンコードされたメッセージには、そのタグ番号を持つキーと値のペアがある場合とない場合があります」と記載されています。あなたは明確にしていただけますか? – Elpezmuerto
@Elpezmuerto https://developers.google.com/protocol-buffers/docs/encoding#optional - 重要な点は「ゼロ以上」です。 「省略された」という全体の点は、それがゼロの場合である。メッセージの順方向互換性を可能にするのはこのことです。はい、ライター*はデフォルト値のバイトを出力できますが、それは "省略"されません - それは確かに値を持ち、受信者は省略された値であることを検出できません –