libutil: Reserve memory when en/decoding base64

The size of the output when encoding to and decoding from base64 is
(roughly) known so we can allocate it in advance to prevent
reallocation.
This commit is contained in:
Daniel Pauls 2022-04-05 21:16:11 +02:00
parent 27b952a8a1
commit 1fa0393479

View file

@ -1471,6 +1471,7 @@ constexpr char base64Chars[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuv
std::string base64Encode(std::string_view s) std::string base64Encode(std::string_view s)
{ {
std::string res; std::string res;
res.reserve((s.size() + 2) / 3 * 4);
int data = 0, nbits = 0; int data = 0, nbits = 0;
for (char c : s) { for (char c : s) {
@ -1502,6 +1503,9 @@ std::string base64Decode(std::string_view s)
}(); }();
std::string res; std::string res;
// Some sequences are missing the padding consisting of up to two '='.
// vvv
res.reserve((s.size() + 2) / 4 * 3);
unsigned int d = 0, bits = 0; unsigned int d = 0, bits = 0;
for (char c : s) { for (char c : s) {