https://gcc.gnu.org/bugzilla/show_bug.cgi?id=60621
--- Comment #7 from marc at kdab dot com --- Retesting with GCC 6.1, it looks better now: $ g++ -O2 -o emplace-vs-push_back{.pb,.cpp} $ g++ -O2 -o emplace-vs-push_back{.eb,.cpp} -DEMPLACE_BACK $ strip emplace-vs-push_back.* $ size emplace-vs-push_back.* text data bss dec hex filename 4474 680 8 5162 142a emplace-vs-push_back.eb 4830 680 8 5518 158e emplace-vs-push_back.nt 5083 656 8 5747 1673 emplace-vs-push_back.pb somewhat at the expense of pessimising push_back(), which used to be 500b smaller in Comment 3, but at least the relation between emplace_back and push_back, and between emplace_back(char[2], char[2], char[2]) and emplace_back(std::string, std::string, std::string) are now as expected.