首頁 >後端開發 >C++ >如何優化將二進位檔案讀取到無符號字元向量中?

如何優化將二進位檔案讀取到無符號字元向量中?

Linda Hamilton
Linda Hamilton原創
2024-11-02 03:37:02271瀏覽

How to Optimize Reading Binary Files into a Vector of Unsigned Chars?

二進位檔案讀取最佳化

要以最佳方式將二進位檔案讀取到無符號字元向量中,請考慮以下策略:

方法1:自訂向量建立

<code class="cpp">std::vector<BYTE> readFile(const char* filename)
{
    std::ifstream file(filename, std::ios::binary);
    std::streampos fileSize = file.tellg();
    file.seekg(0, std::ios::beg);
    std::vector<BYTE> fileData(fileSize);
    file.read((char*) &fileData[0], fileSize);
    return fileData;
}</code>

此方法根據檔案大小明確建立具有正確大小的向量。但是,它將向量的資料轉換為 char*,這是不可取的。

方法 2:Istreambuf 迭代器

<code class="cpp">std::vector<BYTE> readFile(const char* filename)
{
    std::ifstream file(filename, std::ios::binary);
    return std::vector<BYTE>((std::istreambuf_iterator<char>(file)),
                              std::istreambuf_iterator<char>());
}</code>

此方法使用將資料讀入的迭代器內部有一個字元緩衝區。雖然它更短,但儘管讀取無符號字符,它仍然需要字符迭代器。

方法 3:基本 Ifstream 專業化

<code class="cpp">std::vector<BYTE> readFile(const char* filename)
{
    std::basic_ifstream<BYTE> file(filename, std::ios::binary);
    return std::vector<BYTE>((std::istreambuf_iterator<BYTE>(file)),
                              std::istreambuf_iterator<BYTE>());
}</code>

此方法使用專門的輸入檔案流對於無符號字元。但是,它可能不適合所有情況。

最佳化

  • 預留容量:為向量預先分配記憶體可以提高效能。
  • 停用換行符抑制: 二進位模式下的 ios::skipws 可能會導致效能問題;使用 unsetf 停用它。
  • istream_iterator 與 std::copy: std::copy 可以避免與運算子 >> 相關的開銷。

注意事項

  • Istreambuf 迭代器可能因其簡單性而受到青睞,但自訂迭代器可能會提供更好的效能。
  • 「最佳」方法取決於應用程式和正在讀取的資料。

以上是如何優化將二進位檔案讀取到無符號字元向量中?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn