2

私は組み込み機器用の「最初の」Cソフトウェアを開発しています。

ooスタイルでコードを書きたいので、構造体を使い始めました。

typedef struct sDrawable {
    Dimension size;
    Point location;
    struct sDrawable* parent;
    bool repaint;
    bool focused;
    paintFunc paint;
} Drawable;

typedef struct sPanel {
    Drawable drw;
    struct sDrawable* child;
    uint16_t bgColor;
} Panel;

私はmallocを使用できず、使用したくないので、構造体をインスタンス化するためのより良い方法を検索します。これは受け入れられますか?

Panel aPanel={0};

void Gui_newPanel(Panel* obj, uint16_t x, uint16_t y, uint16_t w, uint16_t h, uint16_t bgColor) {
    // Drw is a macro to cast to (Drawable*)
    Drw(obj)->repaint = true;
    Drw(obj)->parent= NULL;
    Drw(obj)->paint = (paintFunc) &paintPanel;
    Drw(obj)->location=(Point){x, y};
    Drw(obj)->size=(Dimensione){w, h};
    obj->child = NULL;
    obj->bgColor = bgColor;
}

void Gui_init(){
    Gui_newPanel(&aPanel, 0, 0, 100, 100, RED);
}

アップデート

最初のものでは、Panel aPanel={0};Gui_newPanel関数にポインタを渡すように構造体を初期化する必要があります。そうしないと、書き込みしかできませPanel aPanel;んか?私はテストして両方とも動作しましたが、たぶん私は運が悪いだけです...

それともこれはより良い方法ですか?

Panel aPanel;

Panel Gui_newPanel(uint16_t x, uint16_t y, uint16_t w, uint16_t h, uint16_t bgColor) {
    // Drw is a macro to cast to (Drawable*)
    Panel obj;
    Drw(&obj)->repaint = true;
    Drw(&obj)->parent= NULL;
    Drw(&obj)->paint = (paintFunc) &paintPanel;
    Drw(&obj)->location = (Point){x, y};
    Drw(&obj)->size = (Dimension){w, h};
    obj.child = NULL;
    obj.bgColor = bgColor;
    return obj;
}

void Gui_init(){
    aPanel=Gui_newPanel(0, 0, 100, 100, RED);
}

これらの方法のどれが好ましいですか?

特にパフォーマンスとメモリ使用量に関心があります。

ありがとう

4

1 に答える 1

3

sを値で返すstructと、構造体メンバーをコピーするオーバーヘッドが発生する可能性がありますが、コンパイラーはこれを最適化するのに十分賢いことがよくあります。オーバーヘッドが心配な場合は、2つのアプローチの相対的なパフォーマンスをプロファイルする必要があります。

また、デバイスのターゲットコンパイラが実際に構造体の戻りをサポートできるかどうかを確認します。非常に古いコンパイラの中には、構造体の戻りや割り当てをサポートしていないものがあります。

かなり最新のコンパイラを使用している場合は、structリテラルを直接返すことができる場合があります。これは効率的です。

return (Panel) {
    .drw = {
        .size = {w, h},
        .location = {x, y},
        // ...
    },
    .child = NULL,
    .bgColor = bgColor
};
于 2012-08-17T15:15:56.957 に答える