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.
This commit is contained in:
Lioncash 2018-08-08 17:39:00 -04:00
parent d224eb7c39
commit 4afb05d0cc
1 changed files with 3 additions and 2 deletions

View File

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