構造体とクラスを使用する場合、どのようなオーバーヘッドとその他の考慮事項がありますか?

組み込みシステムのCは、従来、構造体を使用して構造化データを保持していました。

ArduinoはC ++をテーブルにもたらすため、クラスを使用できます。代わりに。

非常に類似していると見なすことができる2つの異なるデータ構造があるとしましょう:

typedef struct { int valueOne; int valueTwo; int valueThree; } value_t; 

および:

class Value { public: int valueOne; int valueTwo; int valueThree; } 

メモリに関して、これはどのような違いをもたらしますか?

structテクニックが頻繁に使用されているのがわかります-これはなぜですか?

コメント

  • C ++を正しく思い出せばstructclassの間に、デフォルトの可視性以外に違いはありません
  • structは、主に組み込みハードウェアの大部分がCでコーディングされているために使用されます。したがって、小さなMCUのコードの記述に多くの時間を費やす人は、おそらくC ++よりもCをよく知っています。そして、C ++イディオムの前に自動的にCイディオムに到達します。 ' プログラマーのパフォーマンスの問題です。

回答

C ++でクラスと構造体を使用する必要があるのはいつですか?

C ++のクラスと構造体の唯一の違いは、構造体にはデフォルトのパブリックメンバーとベースがあり、クラスにはデフォルトのプライベートメンバーとベースがあることです。クラスと構造体はどちらも、パブリックメンバーとプライベートメンバーを混在させることができ、継承を使用でき、メンバー関数を持つことができます。

クラスのような機能を持たないプレーンな古いデータ構造体として、構造体を使用することをお勧めします。プライベートデータとメンバー関数を使用して、クラスを集約データ構造体として使用します。

メモリに関しては、アクセス修飾子は違いがなく、Arduinoのメモリ制約を考慮します。複雑な階層を持つクラスを使用する可能性は低くなりますが、とにかくPOD構造体を好みます。

回答

Cとは異なり、インスタンスC ++のstructは、classのインスタンスとまったく同じ方法でオブジェクトです。コンパイルされたコードの観点からは、それらは同一です。メモリ使用量、配置、アクセス時間などはまったく同じです(つまり、オーバーヘッドはありません)。

プログラマーの観点からは、ごくわずかな違いがあります。<のメンバーdiv id = "83e94f536c">

はデフォルトでパブリック可視性を持っていますが、classのメンバーはデフォルトでプライベート可視性を持っています。それ以外の場合、すべての言語機能は両方で同じように機能します。コンストラクタ/デストラクタ、継承、ポリモーフィズム、テンプレート、演算子のオーバーロードなど。structclassから派生させることもできます。

類似性にもかかわらず、非常に単純な構造の場合、C ++で意図的にstructを使用している人を見るのは非常に一般的です。少数のデータメンバーのみで構成され、関数は含まれていません。 classは、より複雑なものに使用されます。ただし、これは純粋に慣例または個人的な好みの問題であり、構造体の意図された複雑さの微妙な指標として使用できます。

回答

他の回答が指摘しているように、特定のstructclassは、パフォーマンスに関して区別できません(わずかな違いがあります構造体の定義方法によるタイプ名のスコープ)。C++での記述は、structclassの間にありませんが、 このディスカッションで説明されているように、 POD(プレーンな古いデータ)であるタイプとそうでないタイプの間。

回答

メモリに関して、これはどのような違いをもたらしますか?

なし。構造体とクラスは同じものであり、保護レベルのみが異なり、どちらかをインスタンス化すると「オブジェクト」が作成されます。

構造体の手法が頻繁に使用されていることを確認してください-これはなぜですか?

入力が少ない場合 “データメンバーを非表示にしようとしないでください。

回答

注意

typedef struct { ... } Foo; 

はC ++で廃止されたため、使用する必要があります

struct Foo { ... }; 

回答ではあまり明確ではありませんが、構造体の他の効果は次のとおりです。デフォルトでのパブリック継承とクラスでのデフォルトでのプライベート継承。

他の人が述べているように、構造体の使用は一般にPODタイプの規則です。

また、技術的には「構造体とオブジェクト」は「構造体vsクラス」(構造体またはクラスをインスタンス化してもオブジェクトが得られるため)。

コメント

  • 編集された質問オブジェクト->クラス。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です