Почему компилятор не может оптимизировать std::string concat?C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Гость
 Почему компилятор не может оптимизировать std::string concat?

Сообщение Гость »


Я пробую такой простой код:

#include #include интервал основной() { const std::string s = std::string("a") + "b"; ставит(s.c_str()); вернуть 0; } Я ожидаю, что компилятор (gcc 4.8.2/clang 3.5.0) оптимизирует такой код

int main() { ставит("АБ"); вернуть 0; } Но у меня не получается получить такой результат, я пробую разные варианты типа "-Ofast", "-flto", "-static-libstdc++", но всегда вижу в выводе дизассемблера вызов трёх функций:

... callq 0x4017e0 ... callq 0x401690 ... callq 0x401490 Первый — вызов std::basic_string, std::allocator >::basic_string(char const*, std::allocator const&).

Итак, есть ли компилятор, который может оптимизировать такой код просто puts("ab"); или хотя бы "std::string s("ab");"?

А если такого компилятора нет, что затрудняет реализацию такой оптимизации?

Обновить О реальном использовании. Я видел много мест в реальном коде с таким шаблоном:

std::string s = std::string(string_const1) + string_const2 + string_variable + string_const3; А если важна производительность, то конечно можно переписать такой код более оптимальными способами.

Но современные компиляторы отлично справляются с оптимизацией кода. А в gcc, например, есть функции __builtin для malloc/free/strcpy/strcat и так далее. И если std::basic_string из libstdc++ из gcc используют эти функции (malloc,free,strcpy,strcat) для части реализации, почему бы не предсказать результат использования функций и дать ответ.
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • `std::map<std::string, enum{1, 2, 3, 4}>` (или std::map<std::string, tuple<bool, bool>>`) кэширует` против `std: :set<st
    Anonymous » » в форуме C++
    0 Ответы
    326 Просмотры
    Последнее сообщение Anonymous
  • String.Substring и string.Concat не выделяют память
    Anonymous » » в форуме C#
    0 Ответы
    16 Просмотры
    Последнее сообщение Anonymous
  • Std: Переместите std :: string из std :: deque then std :: deque :: pop_front?
    Anonymous » » в форуме C++
    0 Ответы
    68 Просмотры
    Последнее сообщение Anonymous
  • Std: Переместите std :: string из std :: deque then std :: deque :: pop_front?
    Anonymous » » в форуме C++
    0 Ответы
    34 Просмотры
    Последнее сообщение Anonymous
  • Назначьте ввод Map> выходу Map>
    Anonymous » » в форуме JAVA
    0 Ответы
    125 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C++»