Предположим, мне нужно вызвать функцию foo
, которая берет ссылку const std::string
из большого количества мест в моем коде:
int foo(const std::string&);
..
foo("bar");
..
foo("baz");
Вызов функции с строковым литералом, подобным этому, создаст временные объекты std::string
, каждый раз копируя литерал.
Если я ошибаюсь, компиляторы не будут оптимизировать это, создавая статический объект std::string
на литерал, который может быть повторно использован для последующих вызовов. Я знаю, что g++ имеет расширенные механизмы пула пулов, но я не думаю, что он распространяется на объекты std::string
.
Я могу сделать эту "оптимизацию" самостоятельно, что делает код несколько менее читаемым:
static std::string bar_string("bar");
foo(bar_string);
..
static std::string baz_string("baz");
foo(baz_string);
Используя Callgrind, я могу подтвердить, что это действительно ускоряет мою программу.
Я думал, что попытаюсь сделать макрос для этого, но я не знаю, возможно ли это. Я бы хотел что-то вроде:
foo(STATIC_STRING("bar"));
..
foo(STATIC_STRING("baz"));
Я попытался создать шаблон с литералом в качестве параметра шаблона, но это оказалось невозможным. А поскольку определение функции в блоке кода невозможно, у меня все из идей.
Есть ли элегантный способ сделать это, или мне нужно прибегнуть к менее читаемому решению?