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:
parent
d224eb7c39
commit
4afb05d0cc
|
@ -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));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Reference in New Issue