瀏覽代碼

fsp_srv: Emplace entries first when building index instead of emplacing last

The current way were doing it would require copying a 768 character
buffer (part of the Entry struct) to the new element in the vector.
Given it's a plain array, std::move won't eliminate that.

Instead, we can emplace an instance directly into the destination buffer
and then fill it out, avoiding the need to perform any unnecessary
copies.

Given this is done in a loop, we can request the destination to allocate
all of the necessary memory ahead of time, avoiding the need to
potentially keep reallocating over and over on every few insertions into
the vector.
Lioncash 8 年之前
父節點
當前提交
4afb05d0cc
共有 1 個文件被更改,包括 3 次插入2 次删除
  1. 3 2
      src/core/hle/service/filesystem/fsp_srv.cpp

+ 3 - 2
src/core/hle/service/filesystem/fsp_srv.cpp

@@ -193,13 +193,14 @@ private:
 template <typename T>
 static void BuildEntryIndex(std::vector<FileSys::Entry>& entries, const std::vector<T>& new_data,
                             FileSys::EntryType type) {
+    entries.reserve(entries.size() + new_data.size());
+
     for (const auto& new_entry : new_data) {
-        FileSys::Entry entry;
+        auto& entry = entries.emplace_back();
         entry.filename[0] = '\0';
         std::strncat(entry.filename, new_entry->GetName().c_str(), FileSys::FILENAME_LENGTH - 1);
         entry.type = type;
         entry.file_size = new_entry->GetSize();
-        entries.emplace_back(std::move(entry));
     }
 }