Почему компилятор не может оптимизировать std::string concat? ⇐ 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) для части реализации, почему бы не предсказать результат использования функций и дать ответ.
Я пробую такой простой код:
#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) для части реализации, почему бы не предсказать результат использования функций и дать ответ.
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
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
-