文字列値のプレースホルダーとして char* (非定数) を使用しているサード パーティのライブラリがあります。これらのデータ型に値を割り当てる正しい安全な方法は何ですか? 独自のタイマー クラスを使用して実行時間を測定する次のテスト ベンチマークがあります。
#include "string.h"
#include <iostream>
#include <sj/timer_chrono.hpp>
using namespace std;
int main()
{
sj::timer_chrono sw;
int iterations = 1e7;
// first method gives compiler warning:
// conversion from string literal to 'char *' is deprecated [-Wdeprecated-writable-strings]
cout << "creating c-strings unsafe(?) way..." << endl;
sw.start();
for (int i = 0; i < iterations; ++i)
{
char* str = "teststring";
}
sw.stop();
cout << sw.elapsed_ns() / (double)iterations << " ns" << endl;
cout << "creating c-strings safe(?) way..." << endl;
sw.start();
for (int i = 0; i < iterations; ++i)
{
char* str = new char[strlen("teststr")];
strcpy(str, "teststring");
}
sw.stop();
cout << sw.elapsed_ns() / (double)iterations << " ns" << endl;
return 0;
}
出力:
creating c-strings unsafe(?) way...
1.9164 ns
creating c-strings safe(?) way...
31.7406 ns
「安全な」方法はコンパイラの警告を取り除きますが、このベンチマークによると、コードは約 15 ~ 20 倍遅くなります (反復あたり 1.9 ナノ秒対反復あたり 31.7 ナノ秒)。正しい方法とは何ですか?その「推奨されない」方法の何がそんなに危険なのですか?