4

私は、目的を最適化するためにオブジェクト指向言語を C に変換する作業を行っていますが、設計上の問題が発生しました。

疑似言語で次のクラスが提供されているコンバーターを検討してください。

class C {
    int a;
    double b;
    int c;

    constructor C(int value) {
        this.a = value;
        this.b = this.a / 10.0;
        this.c = 0;
    }

    void say() {
        print(this.b);
    }
}

簡単に言うと、このクラスを C で構造体として表現できます (エラー チェックをスキップします)。

typedef struct {
    int a;
    double b;
    int c;
} _class_C;

_class_C* _ctor_C(int value) {
    this = malloc(sizeof(_class_C));

    this->a = value;
    this->b = this->a / 10.0;
    this->c = 0;

    return this;
}

void _method_C_say(_class_C *this) {
    printf("%.2f", this->b);
}

void _dtor_C(_class_C *this) {
    free(this);
}

このソリューションは、C コンパイラがバインドされているという約束に苦しんでいます — 構造体のフィールドの追加、削除、または順序の変更をしないでください。そのため、ファクト フィールドacが使用されていないにもかかわらず、コードが肥大化します。

「順序付けされていないフィールド」の動作を実現するにはどうすればよいですか? static が 1 つしかない場合はC、次のように記述できます。

int _staticfield_C_a;
double _staticfield_C_b;
int _staticfield_C_c;

void _ctor_C(int value) {
    _staticfield_C_a = value;
    _staticfield_C_b = _staticfield_C_a / 10.0;
    _staticfield_C_c = 0;
}

void _staticmethod_C_say() {
    printf("%.2f", _staticfield_C_b);
}

そのため、コンパイラは余分なフィールドまたは未使用のフィールドを単独_staticfield_C_bで最適化できますが、動的にインスタンス化できる場合はどのソリューションを使用する必要がCあり、フィールドの順序、メモリレイアウト、およびコードの人間の読みやすさはまったく気にしませんか?

更新:コンパイラにstructsで魔法をかけるように強制しようとしているわけではないことに注意してください。順序付けされていないフィールドを持つ struct のように動作するそれらの代わりが必要です。読みやすさのレベルに関係なく、静的な例で提供したのと同じように.

更新:間違ったパラダイムや言語を選択した場合のように、私の問題はコンバーター自体の設計に関連しているという一般的な意見があります。Converter 自体は Python で書かれており、一般的なオブジェクト指向プログラムのソースを受け取り、それを処理し、同等の C コードを出力してコンパイルするため、クロスランゲージ コンパイラと考えることができます。構造体をどこでどのように使用すべきかを説明してくれたことに満足していますが、この場合、最適化を容易にするために魔法の助けが必要です:)

4

2 に答える 2

4

未使用の構造体フィールドを自動的に検出するために、コンパイラ(またはリンカー - あなたが言及した「未使用オブジェクトの削除」最適化が実際にそこで行われます)を取得しようとしているようです。ありえない、無理だから。これはグローバルな最適化です。宇宙のどこにも特定のフィールドを参照するコードがないことを知っておく必要があります。しかし、コードが将来、そのフィールドを参照する何か (現在のリンクの一部ではないコード) に動的にバインドされる場合はどうなるでしょうか? 同じヘッダーでライブラリをコンパイルするのはどうですか。どのように使用されるかわからない場合、コンパイラはどのくらいの大きさの構造体を作成する必要がありますか?

この最適化を行いたい場合は、残念ながら自分で行う必要があります。C 言語には利用可能なツールがありません。

于 2012-07-13T15:51:44.987 に答える
0

Unionsの代替として調べましたStructsか?

一度に 1 つのフィールドしか使用せず、メモリが心配な場合、これは完璧なデータ構造です。

于 2012-07-13T14:03:10.057 に答える