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


16

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

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

非常に似ていると考えられる2つの異なるデータ構造があるとします。

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

そして:

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

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

私はまだ構造テクニックが頻繁に使用されているのを見ています-これはなぜですか?


5
私はCを思い出す場合++正しく差がないstructclass、デフォルトの可視性以外には
ラチェットフリーク

4
組み込みハードウェアの部分がCでコーディングされているstructため、主にsが使用されると想定します。したがって、小さなMCUのコードを書くのに多くの時間を費やす人は、C ++よりもCの方がはるかによく知っていて、C ++イディオムの前に自動的にCイディオムに到達します。それはだプログラマのパフォーマンスの問題。
コナーウルフ14

回答:


12

C ++でクラスと構造体のどちらを使用すべきかという受け入れられた回答から取られたように

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

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

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


5

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

プログラマーの観点からは、非常に小さな違いがあります。のメンバーはstructデフォルトで一般公開されていますが、aのメンバーはデフォルトでclass非公開です。それ以外の場合、コンストラクタ/デストラクタ、継承、ポリモーフィズム、テンプレート、演算子のオーバーロードなど、すべての言語機能は両方で同じように機能します。structからを導出することもできclass、その逆も可能です。

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


4

他の回答が指摘したように、あなたの特定structとは、class(原因、あなたの構造体を定義した方法にタイプ名のスコープに若干の違いがあります)賢明な区別できないパフォーマンスをしています。C ++での描写が間にないstructclassされるが、タイプ間でPOD(昔ながらのデータ)で説明したように、なく、種類この議論


3

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

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

構造体のテクニックが頻繁に使用されているのを見ます-これはなぜですか?

データメンバーを非表示にしようとしていない場合は、入力を減らします。


2

ご了承ください

typedef struct { ... } Foo;

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

struct Foo { ... };

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

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

また、技術的に「構造体対オブジェクト」は「構造体対クラス」でなければなりません(構造体またはクラスをインスタンス化するとオブジェクトが得られるため)。


編集された質問オブジェクト->クラス。
サイバーギボン14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.