2011-12-27 12 views
1

私は、メッセージ用にカスタムのバイナリプロトコルとバイナリ仕様を持っています。バイナリプロトコルは、各メッセージにいくつかのヘッダーを追加します。メッセージは比較的大きく、約50種類のフィールドがあります。私の必要条件は、Linux 2.6.x上のgccコンパイラを使って、cまたはC++のバイナリメッセージから2つのフィールドだけを解析することです。Cでのバイナリデータの解析

開発者は、ヘッダーを表すクラスとメッセージを表す別のC++クラスを作成しました。メッセージを受信すると、彼はバイトペイロードのstatic_castを使用してメッセージクラスを取得します。メッセージ・オブジェクト・クラスを取得すると、単にpointerToMessage.getFieldName()を使用してデータを取得します。

上記の段落を修正しました。開発者はメッセージのクラスではなく構造体を作成しました。構造体はgccの__attribute __((__ packed__))を使用します。

私の質問は、static_castを使用すると、メッセージ全体が解析されるかどうかです。または、ポインティングはアクセス時間に発生します(たとえば、pointerToStruct.fieldName)。 また、2つの操作をタイムアウトし、static_castを実行する時間が実質的にないことを発見しました。ここでは、pointerToStruct.fieldNameを介してフィールドにアクセスするのに約120mircosecondsがかかります。なぜフィールドへのアクセスに時間がかかるのですか?

+1

なぜstatic_castが解析を実行するのですか? – Pubby

+0

私はC++の開発者ではなく、コード化された人は利用できないため、お詫び申し上げます。したがって、上記の質問。それで、アクセス時に解析が行われるのは本当ですか? – Jimm

+1

@ Jimm:あなたが今までに説明したことは、まったく解析することはありません。 – ildjarn

答えて

2

私の質問は、それはstatic_castを専用メモリの内容がキャストされたポインタで指さコンパイラに指示します

番号を解析されたばかりメッセージ全体ではstatic_cast結果を使用してしまうかのように扱われるべきであることキャストする形式のデータが含まれていました。データがその形式でない場合、ほとんどの場合ガベージ・アウトが発生します。

着信バッファにキャストされているタイプの正しいデータが含まれていることを100%確信している場合、これはデータに効率的にアクセスする方法です。しかし、あなたはメッセージやプロトコルについて話しているので、コミュニケーションのシステム上でエンディアン、アライメント、パッディング、ワードライズなどのことは行われません。

また、彼は2つの操作を時限と、それはそれはpointerToMessage.getFieldNameを経由して、フィールドにアクセスするために約120 mircosecondsを取るにstatic_castを行うにはほとんどない時間を、()かかりことがわかりました。なぜフィールドへのアクセスに時間がかかるのですか?

おそらく、キャストのリアリティはそれほど大したことではないため、本質的には与えられたタイプのポインタをあなたが与えたメモリアドレスに作成するだけです。実際のアクセスは、メッセージの内容を読むときに発生します。