2017-07-19 8 views
1

私はいくつかの助言が必要です。アーキテクチャーサイズより小さいサイズの変数を有効な選択肢に選択していますか?

状況:

  • 私は、32ビットアーキテクチャ上のANSI Cアプリケーションを開発しています。
  • 私のビジネスロジックのほとんどの変数は、設計によってuint8_tに適合します。
  • ほとんどの変数はuint8_tデータセグメント
  • としてメッセージで送信する必要が私は

質問の梱包構造体を使用しないでください。

  • を、私が使用している場合、私のアプリケーションの利益は、可搬性の観点からでしょうsize_tと外部インターフェイスのシリアル化のすべての変数をダウンキャスト?
  • シリアル化部分の横にuint8_tまたはsize_t + castingを使用した場合のパフォーマンス効果はありますか?
  • アーキテクチャより小さいサイズの変数の可変サイズの選択に関するベストプラクティスはありますか?

種類は以下の

+2

将来的にメンテナンスする人が何を意味するのかが明確になるようにコードを記述してください。ビジネスロジックのデータが常にuint8_tに収まる場合は、uint8_tを使用します。コードの内容をデコードしようとすると、より明確になり、精神的負荷が軽減されます – Art

答えて

0

アーキテクチャーサイズより小さい変数を有効な選択肢に選択していますか?

はい。選択的に使用する。

size_tを使用し、外部インターフェイスのシリアル化ですべての変数をダウンキャストすると、アプリケーションの移植性が向上しますか?

No. size_tを使用して、一般的な整数の計算ではなく、配列とサイズの計算にインデックスを付けます。その範囲はプラットフォームによって異なります。

は、シリアル化の一部の横にキャスト+ uint8_tまたはsize_tを使用してあり、パフォーマンスへの影響はありますか?

必要がない限り、キャストは避けてください。 uint8_tを使用すると、バイトエンディアンの問題がないという点でかなりのプラスになります。ポストされていないコードには他の特定のパフォーマンスのシリアル化の問題がありますが、それを確認する必要があります。

よりも少ないアーキテクチャサイズ変数の変数サイズの選択に関するベストプラクティスはありますか?

の配列のデータは、必要な範囲全体をエンコードする最小のタイプを使用してください。

バイナリファイルを読み書きするには、ファイル形式と一致するuint8_t, int32_tなどの明示的な型を使用します。

特定の幅の種類を義務付ける明示的なアルゴリズムについては

uint8_t, int16_t, etc.

エルス

を使用し、明確にするためのコードが主要な関心事です。 int/unsignedよりも小さい使用@Art


は、予期しないと、多くの場合、微妙なプロモーション/数学の効果をもたらします。 1)要件2)重要が懸念される場合には、避けて使用するのが最善です。

int/unsignedは、プラットフォームの速度に最適なタイプです。重要なコードを選択する場合はfastタイプ@Lantingを使用してください。

0

については、それぞれのご質問です:

  • それは利益ではないだろうが、それは、コードの複雑さを増加します。
  • パフォーマンスの効果はありますが、マシンサイクルはわずかです。アビオニクスのような非常にクリティカルなプログラムを実際に作成している場合は、それを気にする必要があります。
  • CPUのアーキテクチャごとに可変サイズを使用する場合のベストプラクティスはありません。プログラムは、CPU固有ではなく移植性を考慮して設計する必要があります。

これが役立ちます。

1

size_tを使用し、外部インターフェイスのシリアル化ですべての変数をダウンキャストすると、アプリケーションの移植性が向上しますか?

uint8_tとsize_tは両方とも移植性があり、正しく使用してください。アーキテクチャとは独立して8ビットを超えない値を格納する場合は、uint8_tを安全に使用できます。それをサポートするすべてのアーキテクチャで同じサイズになることが保証されています。

size_tは、オブジェクトのサイズを保持するのに十分な大きさであることが保証されています。その機能が必要な場合は、size_tを使用してください。しかし、size_tの実際のサイズについては、少なくとも16bit以外のものを前提にすることはできません。

シリアル化部分の の横にuint8_tまたはsize_t + castingを使用するとパフォーマンス効果がありますか?

アルゴリズムとデータ構造の選択はパフォーマンスに影響しますが、整数型の選択は心配しないでください。これはコンパイラにも依存しているため、アーキテクチャー、プロセッサーであっても、最終的な答えはありません。本当に好奇心がある場合はベンチマークをいくつか行いますが、違いは見られません。

より小さいアーキテクチャの可変サイズの可変サイズの選択に関するベストプラクティスはありますか?

はい、いいえ。どのようにコードの品質を測定しますか?移植性、可読性、パフォーマンス、メモリーの必要性...すべてはあなたのユースケースに依存します。移植可能なコードを記述するためのベストプラクティスは、移植可能な型を使用しており、何も前提としていません。あなたのコードをコメントしてください。特別な組み込みユースケースの場合、メモリを節約するために可能な限り小さな型を使用するとよいでしょう。しかし、ここでも一般的な答えはありません。

+1

詳細:「uint8_tとsize_tの両方が移植可能です」 - >「uint8_t」は疑似オプションです。それをサポートできるすべてのプラットフォーム(ほとんどのプラットフォーム)で必須ですが、必須ではなく残りのいくつかには存在しません。 – chux

2

あなたが何をしても、size_tは8ビットに収まるいくつかのデータを保存するには悪い選択です。 size_tがマシンのの自然語サイズより大きいプラットフォームがあります。

通常、(unsignedintを使用することをおすすめします。これは保証されていませんが、ほとんどの場合、この方法で最高のパフォーマンスを得ることができます。 intは少なくとも16ビットを持つ必要があるため、たとえば8ビットμcでは悪い選択です。しかし、一般的なケースでは、それは良い選択です。

あなたの懸念はメモリ消費量である場合(例えば、あなたはデータの巨大な配列を持っていますが、すべて単一の値がuint8_tに収まるだろう)、は、あなたの代わりにuint8_tを使用する必要があります。

もちろん、確定の回答はここではありません。 unsigned intを使用することを決定したが、非常に頻繁にシリアライズする必要がある場合は、プログラム全体でuint8_tを使用するだけでなく、多くの費用がかかります。疑わしい場合は、両方の実装(typedefと条件付きコンパイルを使用)と測定のパフォーマンスを試してください。

1

私はまだ誰もがfast typesと言及して驚いています。

int_fast8_tn int_fast16_tなどは、少なくとも指定された幅でターゲット上の他の整数型と同じくらい速い整数型定義を提供します。

+0

私は彼らに言及しようとしていたので、upvote ...しかし、彼らは使用されたメモリの可能なコストでperfsを向上させることを目指して追加する必要があります。 –

関連する問題