ステップバイステップでは、PCMのWAVファイルにfseekを使用しながら作業休憩:C++ O3の最適化、私は「データ」のファイルを検索し、この単純なコードを持っているループ
FILE * waveFile;
waveFile = fopen (this->fileLocation.c_str (), "rb");
// ... some other code here between, then ... //
int seekTo = 0;
bool found = false;
char data[4];
rewind (waveFile);
while (!found && (fseek (waveFile, seekTo, SEEK_SET) == 0)) {
fread (data, sizeof (data), 1, waveFile);
if ((std::strcmp (data, "data") == 0) || (std::strcmp (data, "Data") == 0) || (std::strcmp (data, "DATA") == 0)) {
found = true;
fread (&waveHeader->DATA_SIZE, sizeof (waveHeader->DATA_SIZE), 1, waveFile);
}
seekTo++;
}
コードが正しく動作し、テストファイルにそれはデータを見つけ、残りを読みます。最大のファイルでさえ "データ"が最初から近いので、このコードは大丈夫です。
しかし、私がcppフラグ-O3を追加すると、ループが終了しないうちに、コードがうまく行きます。私はcmakeの+ lldb(OSX、clion)を使用してい
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -O3")
私はGDBを使用した場合、同じことが起こります。
何が問題になる可能性がありますか?これをどのように解決できますか?
PS。私はあなたが見るコードを改善しようとしていない、私はコンパイラの最適化がなぜこのループをハックするのか理解しようとしている。
PSS。
int seekTo = 0;
char data[5];
rewind (waveFile);
while ((fseek (waveFile, seekTo, SEEK_SET) == 0)) {
fread (data, 4, 1, waveFile);
data[ 4 ] = '\0';
if ((std::strcmp (data, "data") == 0) || (std::strcmp (data, "Data") == 0) || (std::strcmp (data, "DATA") == 0)) {
fread (&waveHeader->DATA_SIZE, sizeof (waveHeader->DATA_SIZE), 1, waveFile);
break;
}
seekTo += 1;
}
'std :: strcmp(data、" data ")== 0'は' data'の境界を読み込みます。あなたはヌル終了について忘れています。おそらく長さ '4'の' memcmp'を使いたいかもしれません。 –
また、 'fread'が成功したかどうかチェックし、失敗した場合はループを中断してください。 –
@ M.M私はもともとfreadのためのsize_tチェックをコード中に持っていて、ある時点で0を返します。しかし、私が持っているすべてのファイルには "データ"があり、何かを見つける前にファイルの終わりに達しています。私はデバッグのための終了チェックを削除しました。 – emrahgunduz