バナーをクリックすれば目次に戻ります
Copyright 1999 Rogue Wave Software
Copyright 1999 Sun Microsystems, Inc.
RWTValVirtualArray<T>
#include <rw/tvrtarry.h> RWVirtualPageHeap* heap; RWTValVirtualArray<T> array(1000L, heap);
スワップ領域は、コンストラクタが指定する抽象ページヒープによって提供されます。任意の数の仮想配列で、同一の抽象ページヒープを使用できます。その抽象ページヒープから構築された仮想配列をすべて破壊してからでないと、抽象ページヒープのデストラクタを呼び出すことはできません。
このクラスは、書き込み時コピーの技法を使用して参照カウントをサポートしているので、関数から値によって仮想配列を返す処理などは非常に効率良く行われます。しかし、書き込み時コピーの技法も結局コピーを行う必要があり、大きな仮想配列の場合にはかなり時間がかかります。
効率を上げるためには、複数の要素を 1 ページに設定するとよいでしょう。実際の要素数は、ページサイズを要素サイズで割って余りを切り捨てたものになります。たとえば、ページサイズが 512 バイトで要素サイズが 8 バイトの場合は、1 ページに 64 要素割り当てられることになります。
インデックス付け演算子 (operator[](long)) は、型 RWTVirtualElement<T> のオブジェクトを返します。
double d = vec[j]; vec[i] = 22.0;上記の例で、vec は型 RWTValVirtualArray<double> であるとします。式 vec[j] は型 RWTVirtualElement<double> のオブジェクトを返します。これはアドレスを指定された要素への参照を含んでいます。1 行目では double を初期化しています。クラス RWTVirtualElement<T> には、自分自身を T (この場合、double) に変換する型変換演算子があります。コンパイラはこれを使用して d を初期化します。
2 行目では、式 vec[i] を左辺値として使用しています。この場合、コンパイラは型 RWTVirtualElement<T> の代入演算子を使用します。この代入演算子はこの式が左辺値として使用されていることを認識し、自動的に該当ページに "変更済み (dirty)" の印を付けます。これによって、そのページがスワップ媒体に書き戻されることが保証されます。
個々の要素だけでなく、スライスもアドレス指定できます。スライスではページをアンロックする前に複数回ロックして使用できるため、非常に効率的です。
クラス T には、次のものが必要です。
また、要素のアドレスを直接使用してはいけません。
なし
#include <rw/tvrtarry.h> #include <rw/rstream.h> #include <rw/diskpage.h> #include <stdlib.h> #include <stdio.h> struct ErsatzInt { char buf[8]; ErsatzInt(int i) { sprintf(buf, "%d", i); } friend ostream& operator<<(ostream& str, ErsatzInt& i) { str << atoi(i.buf); return str; } }; main() { RWDiskPageHeap heap; RWTValVirtualArray<ErsatzInt> vec1(10000L, &heap); for (long i=0; i<10000L; i++) vec1[i] = i; // コンパイラによってはここでキャストを必要とする cout << vec1[100] << endl; // "100" を出力する cout << vec1[300] << endl; // "300" を出力する RWTValVirtualArray<ErsatzInt> vec2 = vec1.slice(5000L, 500L); cout << vec2.length() << endl; // "500" を出力する cout << vec2[0] << endl; // "5000" を出力する; return 0; } |
100 300 500 5000 |
RWTValVirtualArray<T>(long size, RWVirtualPageHeap* heap);
RWTValVirtualArray<T>(const RWTValVirtualArray<T>& v);
RWTValVirtualArray<T>(const RWTVirtualSlice<T>& sl);
~RWTValVirtualArray<T>();
RWTValVirtualArray& operator=(const RWTValVirtualArray<T>& v);
void operator=(const RWTVirtualSlice<T>& sl);
T operator=(const T& val);
T operator[](long i) const;
RWTVirtualElement<T> operator[](long);
long length() const;
T val(long i) const;
void set(long i, const T& v);
RWTVirtualSlice<T> slice(long start, long length);
void reshape(long newLength);
RWVirtualPageHeap* heap() const;