私のお気に入りの本 (Ellen Ullman の The Bug) をパラパラとめくるだけで、あるプログラマーが別のプログラマーに 3 つのレベルの間接性で直面している小さな部分があります。
***object_array = ***winarray;
二重間接参照のアイデアが浮かびました。これは、ポインタを関数に渡し、関数内で作成されたオブジェクトを指すようにする方法です。
しかし、3 つ (またはそれ以上) のレベルの間接化を使用する理由はありますか?
私のお気に入りの本 (Ellen Ullman の The Bug) をパラパラとめくるだけで、あるプログラマーが別のプログラマーに 3 つのレベルの間接性で直面している小さな部分があります。
***object_array = ***winarray;
二重間接参照のアイデアが浮かびました。これは、ポインタを関数に渡し、関数内で作成されたオブジェクトを指すようにする方法です。
しかし、3 つ (またはそれ以上) のレベルの間接化を使用する理由はありますか?
確かに
4次元配列。
このような配列のアプリケーションにもそれほど多くはかかりません。ある種のルックアップテーブルを言ってください。8 次元以上のルックアップ テーブルがあります。
David Wheele が言ったように、「コンピューター サイエンスの問題は、別の間接的なレイヤーで解決できます。」次のような行で、ほぼ確実に 3 層の間接化を使用しています。
int x = 3;
結局、チップは、L1 キャッシュと L2 キャッシュの 2 つのレイヤーを介してメモリ アクセスを間接的に行っています。また、OSは仮想メモリページを介してメモリアクセスを間接的にしています。また、C# コンパイラは、仮想マシン内のオブジェクトを介してメモリ アクセスを間接化しています。確かに、アスタリスクの長い行は付いていませんが、それは、これらの間接的なすべてが、マシン、OS、またはコンパイラのようなもので抽象化されているためです.
いいえ、私は実際にそれを見たり使用したりしたことはありません (私が思い出す限りでは、少なくともそれをより面白くするための賢明な 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 つのポインター レベルになる可能性のある例にすぎません。ただし、この種のシナリオに頻繁に遭遇することは想像できません。
現在、3 つ以上のレベルで実行されている可能性があります。...で実行されているリモート アクセスを介して、Mac (または VM) 上の Windows で実行されているブラウザーの javascript の jQuery である可能性があります。
または、質問のコンテキストに近い別の観点から見ると、3 レベルが最も一般的なアーティファクトです。
Window のコンテナー内のコントロールへのポインターは何ですか?