このようなことを達成することはできますが、それほど多くを得る可能性は低いでしょう。
まず、パフォーマンスの側面があります。あなたはメモリ消費のために時間を交換しています。保存したメモリは、呼び出しごとに加算と乗算を行う必要があるため、相殺されます(乗算を最適化できるend
ベクトルであれば大丈夫です)。ほとんどの手書きのベクトル ループ コードは、すべてのループ反復でsizeof(vector<t>::value_type) == 1
呼び出されることに注意してください。end
最新の CPU では、プロセッサがより多くのものをキャッシュに保持できるため、実際には大きなメリットとなります。内部ループ内のこれらの余分な命令のカップルが、プロセッサに命令キャッシュ内のものを頻繁にスワップさせない限り)
さらに、次の理由により、ベクター内の全体的なメモリ使用量に関して、メモリの節約は少ない可能性があります。
- メモリ マネージャーのオーバーヘッド。ほとんどのメモリ マネージャーの実装では、メモリ マネージャーからの各割り当て (もちろん、このベクトルが必要です) によって、16 ~ 24 バイトのオーバーヘッドが追加されます。
dlmalloc
( (UNIX / Linux / etc。)またはRtlHeap
(Windows)のようなものを想定)
- 負荷のオーバープロビジョニング。最後に償却された定数の挿入と削除を実現するために、ベクトルのサイズが変更されると、ベクトル内のデータのサイズの倍数にサイズ変更されます。これは、ベクトルが割り当てる一般的なメモリ容量が、ベクトルに実際に格納されている要素数の 1.6 (MSVC++) または 2 (STLPort、libstdc++) 倍で十分であることを意味します。
- アライメントの制限。これらの多くのベクトルを配列 (または別のベクトル) に入れる場合、そのベクトルの最初のメンバーは、割り当てられたメモリ ブロックへのポインターのままであることに注意してください。このポインターは通常、とにかく 8 バイトでアラインする必要があります。そのため、保存した 4 バイトは、配列内の構造パディングで失われます。
今のところ、vector の単純な実装を使用します。メモリ プロファイラーを使用してコードを実行し、これらの 2 つのポインターを取り除くことで大幅な節約ができることがわかった場合は、組み込みのクラスに依存するのではなく、パフォーマンス特性を満たす独自の最適化されたクラスを実装することをおそらくやめています。ベクトル実装。(このような最適化されたクラスの例はstd::string
、小さな文字列の最適化を実装するプラットフォームにあります)
(注:ポインタを最適化することを私が知っている唯一のコンパイラは、Alloc
まだリリースされていないVC11です。Nimは、libstdc ++の現在のプレリリースバージョンも同様にそれを行うと言っています...)