1

トピックは一般的にそれをすべて言います。基本的には次のような状況です。

boost::scoped_array<int> p(new int[10]);

実行することと実行することの間に、パフォーマンスにかなりの違いはあり&p[0]ますp.get()か?

私は最初のものを好むので、構文のようなより自然なポインターを持っているのでお願いします。実際、これにより、p をネイティブ ポインターまたは配列に置き換えることができ、他に何も変更する必要がなくなります。

get は 1 つのライナー " " であるため、コンパイラはそれをインライン化するのではないかと推測しています。逆参照せずにすぐに参照できるようreturn ptr;にインライン化するのが賢明であることを願っています。operator[]

誰でも知っていますか?

4

3 に答える 3

2

実際に測ってみるしかわかりません!

しかし、boost:scoped_array のソースがあれば、コードを調べて、その動作を確認できます。確かによく似ていると思います。

T * scoped_array::get() const // never throws
{
    return ptr;
}

T & scoped_array::operator[](std::ptrdiff_t i) const // never throws
{
    BOOST_ASSERT(ptr != 0);
    BOOST_ASSERT(i >= 0);
    return ptr[i];
}

2 つのバージョンのコードを記述します (1 つは get() を使用し、もう 1 つは operator[] を使用します)。最適化をオンにしてアセンブリにコンパイルします。コンパイラが実際にptr + 0を最適化しているかどうかを確認してください。

于 2008-11-07T22:48:25.890 に答える
1

OK、Martin York の提案に従っていくつかの基本的なテストを行いました。

g++ (4.3.2) は実際にはこれについてかなり良いようです。-O2 と -O3 の両方の最適化レベルで、 と の両方に対して、わずかに異なるが機能的に同等のアセンブリを出力し&p[0]ますp.get()

予想通り -Os で、複雑さが最も少ないパスを取り、 への呼び出しを発行しますoperator[]。注意すべきことの 1 つは、&p[0]バージョンによって g++ がoperator[]本体のコピーを発行することですが、それは決して使用されないため、他の方法で使用しない場合はわずかなコードの肥大化がありますoperator[]

テストしたコードは次のとおりです ( #if0 と 1 の両方を使用):

#include <boost/scoped_array.hpp>
#include <cstdio>

int main() {
    boost::scoped_array<int> p(new int[10]);
#if 1
    printf("%p\n", &p[0]);
#else
    printf("%p\n", p.get());
#endif
}
于 2008-11-07T23:07:29.457 に答える
0

これは学術的な関心のためだけに尋ねている質問ですか、それともあなたが書いている現在のコードのためですか?

一般に、コードの明確さは速度よりも重要であると推奨されているため、これが違いを生むことが確実でない限り、より明確でコードベースに一致するオプションを選択する必要があります. FWIW、私は個人的に get() の方が明確だと思います。

于 2008-11-08T02:24:37.060 に答える