データ型の制限に達すると、データ型のサイズを増やしたいと考えています。たとえば、のは、私はクラスを持っているとしましょう:私はCounter.xの値を変更するとデータ型の制限に達すると、データ型を動的に変更する簡単かつ効率的な方法はありますか?
struct Counter {
unsigned short x;
void IncrementCount() { x++; }
};
は、私が代わりにunsigned short型のunsigned int型であることをXを促進するためにそれをしたいと思います。
int main() {
Counter c;
c.x = ~0; // c.x is max unsigned short value 2^16
c.IncrementCount(); // c.x is now an unsigned int with value 2^16 + 1, NOT an unsigned short with value 0
}
私がこれをやっているのは、可能な限りカウンタークラスに少しのメモリを保存するためです。
明らかに、パフォーマンスと可読性をできるだけ低下させたいと思っています。
voidポインタを使用し、適切なデータ型にキャストすることを検討しましたが(余分なメモリを使用せずに型を追跡する方法は?)、CounterクラスのIncrementCount()メソッドを変更して、 unsigned shortの限界に達すると(短いものではなくintを使用します)(ただし、これによって複雑さが増します。また、増分ごとに余分なifが追加されます)。たぶん、余分なビットが必要なたびにサイズが増加するビットマップですか?複雑さといくつかのパフォーマンスヒットを追加します。
私は1000万のカウンターを持っていますが、私はintに余分な2バイトを使いたくありません(余分な2千万のバイトが必要です)。私はアラインメントがshort - > intの問題を修正する可能性があることを知っていますが、これはint32 - > int64と他の型に対しても有効です。これは実行時の問題であることにも注意してください(コンパイル時のサイズは分かりません)。
これを行うにはC++で簡単な方法がありますか?
代わりにbigintライブラリを見てみてください。 – jaggedSpire
それをテンプレートにして、基礎となるタイプを指定するのはなぜでしょうか?そうすれば、小さなカウンターが必要なことが分かっている場合は、小さなタイプを使用します。大きなカウンターが必要な場合や不明な場合は、より大きなタイプを使用しますか? – NathanOliver
これには動的割り当てが必要です –