0

簡単な例:

template <class P> class MyT
{
    struct Item
    {
    public:
        Item() {}
        P *pData;
        Item *next;
    };
    Item *head;
public:
    ...adding etc..
    P* operator [](int index)
    {
       See question below:
    }
};

次のようにオフセットを計算できるように、アイテムが割り当てられていることをどうにかして確認できますか:(@Steve :)ここではあまり明確ではないかもしれません。私が必要としているのは、次の 10000 を反復せずにアイテムに到達するための迅速かつ簡単な方法です。

Item *pi = head + (sizeof(Item) * (index - 1));

私が言いたいことの(より明確な?)説明

4

5 に答える 5

1

「追加など」の「etc」の意味によって異なります。

「etc」に「removing」が含まれている場合、リストの途中で何かを削除すると、インデックスを維持するために、その後のすべてを下にシフトする必要があるという明らかな問題があります。つまり、すべてのnextポインタが更新されます。

例を単純化しすぎたのではないかと思います。連続したストレージが必要な場合は、ベクトルを使用します(、、Pまたは削除Itemしたものに役立つものがある場合は、のいずれかItem)。連続したストレージがある場合は、に1を加算するnextだけでポインターを計算できるため、ポインターを使用してもメリットはありません(次に、境界をチェックして、最後に到達していないことを確認します)。Itemthis

パブリックポインターフィールドがどうしても必要な場合は、next実装しているインターフェイスの一部であり、変更できないため、コピーコンストラクターとoperator=forItemで更新できます。インターフェイスは、クライアントによる書き込みを禁止する方が適切です。

それがあなたが求めているものであるならば、別々の割り当てのために連続したストレージを割り当てるようにメモリアロケータに指示する方法はありません。それはどのように機能しますか?割り当てるときに、「次の」アドレスがすでに占有されている場合はどうなりますか?アロケータが(ほとんどすべての汎用アロケータが行うように)独自の制御構造に対していくらかのオーバーヘッドを課し、その結果、アロケータの割り当てにバイトItem以上が必要な場合はどうなりますか?固定サイズのアロケータsizeof(Item)を使用すると、しばらくの間、必要な動作を得ることができますが、最終的には新しいブロックが必要になるか、何かを削除すると、関係が維持されなくなります。

于 2010-09-13T09:11:32.617 に答える
1

必要なのは std::list または std::vector だと思います。

ただし、アイテムにシーケンシャル メモリを割り当てていて、Yossarian によって提案された変更と共に head が開始点を指している場合、あなたが試みていることは機能します。

この制限を超えた場合は、初期化中に事前に割り当て、さらに割り当ててコンテンツをその領域にコピーし、既存のものを解放することができます。

注: これらはすべて std コンテナーにラップされています。

于 2010-09-13T07:54:13.820 に答える
1

「メモリ境界」は、特別な gcc キーワードを使用して強制できます

http://gcc.gnu.org/onlinedocs/gcc/Variable-Attributes.html#Variable-Attributes

「アライメント」を見てください。

于 2010-09-13T20:32:12.443 に答える
0

あなたの質問を正しく理解している場合は、必要なすべての s を格納するのに十分なメモリをアロケータに事前に割り当てて、オーバーライドoperator newする必要があります (これは一般的なケースでは不可能ですが、特定のシナリオでは可能かもしれません)。その後、 が更新されるたびに、アロケータは事前​​に割り当てられたブロックの次のスロットを返します。ItemItemItem

これはすべて非現実的に見えますが、簡単な解決策は を使用することstd::vectorです。

于 2010-09-15T08:20:55.320 に答える
-2
Item* pi = (head + (index - 1));

仕事をします。ところで、これを実行してもよろしいですか?struct Itemリンクされたリスト構造のように見えます ( を含むnext)。

于 2010-09-13T07:47:18.380 に答える