https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63466
--- Comment #4 from Jonathan Wakely <redi at gcc dot gnu.org> ---
The calls you see to getc are nothing to do with <sstream>, they're from the
std::getline call reading from stdin, and are required because you didn't tell
the C++ runtime that you don't need it to be synchronised with C stdio. If you
don't need to mix C and C++ I/O then you forgot the most important thing for
iostream performance on standard I/O streams:
std::ios::sync_with_stdio(false);
If you don't need that synchronisation, don't use it.
Something like this is a more accurate equivalent of the C program, and much
closer in performance:
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
void __attribute__((noinline, noclone)) func(char*, char*)
{
}
int main()
{
std::ios::sync_with_stdio(false);
string line;
while (getline(cin, line)) {
char* a = &line[0];
char* b = nullptr;
auto pos1 = line.find_first_of(" \t\n");
if (pos1 != std::string::npos) {
line[pos1] = '\0';
b = a + pos1 + 1;
auto pos2 = line.find_first_of(" \t\n", pos1+1);
if (pos2 != std::string::npos) {
line[pos2] = '\0';
}
}
func(a, b);
}
}