2

私のお気に入りの本 (Ellen Ullman の The Bug) をパラパラとめくるだけで、あるプログラマーが別のプログラマーに 3 つのレベルの間接性で直面している小さな部分があります。

***object_array = ***winarray;

二重間接参照のアイデアが浮かびました。これは、ポインタを関数に渡し、関数内で作成されたオブジェクトを指すようにする方法です。

しかし、3 つ (またはそれ以上) のレベルの間接化を使用する理由はありますか?

4

4 に答える 4

4

確かに
4次元配列。
このような配列のアプリケーションにもそれほど多くはかかりません。ある種のルックアップテーブルを言ってください。8 次元以上のルックアップ テーブルがあります。

于 2008-12-11T01:47:14.573 に答える
3

David Wheele が言ったように、「コンピューター サイエンスの問題は、別の間接的なレイヤーで解決できます。」次のような行で、ほぼ確実に 3 層の間接化を使用しています。

int x = 3;

結局、チップは、L1 キャッシュと L2 キャッシュの 2 つのレイヤーを介してメモリ アクセスを間接的に行っています。また、OSは仮想メモリページを介してメモリアクセスを間接的にしています。また、C# コンパイラは、仮想マシン内のオブジェクトを介してメモリ アクセスを間接化しています。確かに、アスタリスクの長い行は付いていませんが、それは、これらの間接的なすべてが、マシン、OS、またはコンパイラのようなもので抽象化されているためです.

于 2008-12-11T02:14:13.130 に答える
2

いいえ、私は実際にそれを見たり使用したりしたことはありません (私が思い出す限りでは、少なくともそれをより面白くするための賢明な typedef がないわけではありません) が、[疑わしい] 有効な使用方法の例を思いつくことができます:

struct Foo{
    struct greater{
        bool operator()(Foo const *a, Foo const *b) const{
            return a->place > b->place ||
                   a->place == b->place && a->holder > b->holder;
        }
    };

    int place;
    int holder;
};

template<typename T, typename Comparer>
void Sort(T const *unorderedList, int count, T const ***orderedList, Comparer &cmp);

void UseOrderedList(Foo const **orderedList, int count);

int main(){
    Foo list[] = {{1, 2}, {3, 4}, {5, 6}, {7, 8}};
    Foo const **orderedList;

    Sort(list, sizeof list / sizeof *list, &orderedList, Foo::greater());
    UseOrderedList(orderedList, sizeof list / sizeof *list);
    delete[] orderedList;
    return 0;
}

void UseOrderedList(Foo const **orderedList, int count){/*...*/}

template<typename T, typename Comparer>
void Sort(T const *unorderedList, int count, T const ***orderedList, Comparer &cmp){
    /*
     * The result array stores pointers to the items in the original array.
     * This way, the original array is unmodified, and the result array
     * doesn't create duplicate items.  This makes sense if the objects
     * are large and copying them would be slow (another argument against
     * in-place sorting), or if duplicating them violates some design
     * principle.
     */
    *orderedList = new const T*[count];

    for(int i = 0; i < count; i++)
        (*orderedList)[i] = unorderedList + i;

    std::sort(*orderedList, &(*orderedList)[count], cmp);
}

私はここでやったことを実際にはしません。これは、最終的に 3 つのポインター レベルになる可能性のある例にすぎません。ただし、この種のシナリオに頻繁に遭遇することは想像できません。

于 2008-12-11T14:25:50.517 に答える
2

現在、3 つ以上のレベルで実行されている可能性があります。...で実行されているリモート アクセスを介して、Mac (または VM) 上の Windows で実行されているブラウザーの javascript の jQuery である可能性があります。

または、質問のコンテキストに近い別の観点から見ると、3 レベルが最も一般的なアーティファクトです。

Window のコンテナー内のコントロールへのポインターは何ですか?

于 2008-12-11T02:19:27.660 に答える