明示的な初期化の効率
-
01-10-2019 - |
質問
私は、 const char*
. 。そうです:
c::c(const char* str) {
a = 32;
f = 0;
data = new char[strlen(str)];
memcpy(data, str, strlen(str));
}
そして、それらのいずれかをとる関数:
int foo(c& cinst);
あなたはそれを渡すことによって、この関数をと呼ぶことができます c
:
c cinst("asdf");
foo(cinst);
または、明示的な初期化があるため、次のことができます。
foo("asdf");
それはaを作ります c
コンストラクター「ASDF」を渡してから、結果のオブジェクトをに渡すことにより foo
.
ただし、これは過負荷よりもかなり効率が低いようです foo
を取る const char*
. 。速度のために過負荷を行う価値はありますか、それともパフォーマンスの影響は非常に少ないので、過負荷をかけるのはスペースの無駄ですか?私は自分のプログラムをできるだけ速くしようとしているので、速度は重要な要素であるため、サイズもそうではありませんが、それほどではありません。
解決
何がしますか foo
それでやっています const char*
?それがそれを独自にするだけなら c
オブジェクト、それから意味はありません。
使用する場合 char*
直接(および既存 foo
ただ引っ張った char*
の外へ c
オブジェクト)、それから過負荷を書く方が良いでしょう。
他のヒント
ゼロ時間はかかりませんので、それはあなたがとらなければならないトレードオフの1つであり、スピードとAPIの明確さです。もちろん、const char*を取る関数で何をしているのかによって異なります。ACオブジェクトを構築していますか?その場合、Cクラスインターフェイスで関数を提供するだけです。
この種の質問は、プロファイラーで最もよく答えられます。アセンブラーコードを見ると、手がかりが提供される場合があります。
それは状況です。それは、特定の状況でコンストラクター内で実際に何が起こっているか、そしてそのコードが実際に実行されている回数に本当にかかっています。
あなたが与える例では、それらはそのコンストラクターのかなり些細な操作です。合理的な最新のプロセッサでは、これらの操作は非常に迅速になります。そのため、そのコードが1秒あたり膨大な数回実行されていない限り、私はそれについてさえ心配しません。 (もちろん、「巨大」の値は、これを実行することを期待するマシンの種類に依存します。このコンストラクター、典型的なデスクトッププロセッサでは、少なくともスケールになるまで心配することすらありません。毎秒数百回。)
この構造コードがいくつかの回数を実行している場合、あなたはそれをプロファイルし、プログラムで起こっている他のすべてと比較して顕著な影響を持っているかどうかを確実に判断する必要があります。最適化は難しいことです。時々、あなたの腸の気持ちが非効率的であると言っていることは、実際に最終結果にほとんど影響を与えません。測定は常に、プログラムをより速く実行するために実際に時間を費やすべき場所を決定するための方法です。