1

を受け取るコンストラクターを持つクラスがありますconst char*。それは:

c::c(const char* str) {
    a = 32;
    f = 0;
    data = new char[strlen(str)];
    memcpy(data, str, strlen(str));
}

そして、それらの1つを取る関数:

int foo(c& cinst);

この関数は、次のいずれかのインスタンスを渡すことによって呼び出すことができますc

c cinst("asdf");
foo(cinst);

または、明示的な初期化があるため、次のことができます。

foo("asdf");

cコンストラクター「asdf」を渡すことで を作成し、結果のオブジェクトを に渡しますfoo

ただし、これは、単にオーバーロードfooしてconst char*. 速度のためにオーバーロードを行う価値はありますか、それともパフォーマンスへの影響が小さすぎて、オーバーロードを行うのはスペースの無駄ですか? 私は自分のプログラムをできるだけ速くしようとしています。そのため、速度は重要な要素であり、サイズも重要ですが、それほど重要ではありません。

4

4 に答える 4

1

それをどうするfooconst char*?それを自分のcオブジェクトにするだけなら、意味がありません。

char*を直接使用する場合(および既存の がオブジェクトfooから引き出さchar*れた場合) は、オーバーロードを作成することをお勧めします。c

于 2010-08-24T16:54:07.837 に答える
0

この種の質問には、プロファイラーを使用するのが最適です。アセンブラコードを見ると、手がかりが得られる場合もあります。

于 2010-08-24T17:06:20.977 に答える
0

ゼロ時間はかからないので、速度と API の明瞭さのトレードオフの 1 つです。もちろん、const char* を取る関数で何をしているかによって異なりますが、ac オブジェクトを構築していますか? その場合は、c クラス インターフェイスを使用して関数を提供するだけです。

于 2010-08-24T16:56:56.243 に答える
0

状況次第です。実際には、特定の状況でコンストラクター内で実際にどれだけのことが行われているか、およびそのコードが実際に実行されている回数に依存します。

あなたが与える例では、それらはそのコンストラクターでのかなり些細な操作です。合理的な最新のプロセッサでは、これらの操作は非常に高速になります。したがって、そのコードが毎秒非常に多く実行されていない限り、私はそれについて心配することさえありません. (もちろん、「巨大」の値は、これを実行するマシンの種類によって異なります。このコンストラクターの場合、典型的なデスクトップ プロセッサでは、少なくとも毎秒数十万回。)

この構築コードが何度も実行される場合でも、プロファイリングを行い、プログラム内で行われている他のすべてのものと比較して顕著な影響があるかどうかを確認する必要があります。最適化は難しいものです。時には、あなたの直感が非効率的だと言っていることが、実際には最終結果にほとんど影響を与えないことがあります. プログラムの実行速度を最も効果的に高めるために実際にどこに時間を費やすべきかを判断するには、常に測定が必要です。

于 2010-08-24T17:10:37.957 に答える