LINUX.ORG.RU

История изменений

Исправление bonta, (текущая версия) :

И вообще, зачем тебе тут константа с конкатенацией, а не функция, её возвращающая?

Потому что хотелось бы избежать каждый раз конструирование строк, а так

std::string GetFoo() { return "Foo"; }

на сколько я знаю, будет вызываться конструктор всякий раз при вызове GetFoo. А если сделать const std::string &GetFoo() - то уже лишняя прослойка возвращающая всё тот же статик, хотя возможно и не лишняя, еще не совсем въехал в то что описал pon4ik

А их вообще не надо конструировать - объявляй их как char*. Конструирование кучи строк даёт ощутимый оверхед при старте приложения и, вообще говоря, не нужна.

Я заметил что в свои методы с сигнатурой void foo(const std::string &) я могу передавать const char* - но ведь тогда работает оператор приведения типа const char * -> std::string - что есть как раз, как мне кажется, лишняя трата производительности, чем при старте проконструировать, т.к. всякий раз когда передается си строка в ссылку на std строку, то вызывается конструктор std стрки. Кстати время старата как раз самое не приоритетное - приоритетно чтобы работало быстро уже после всей загрузки (ну и код при этом не сильно сишный был, конечно :) )

Но если опереться на эти два высказывания:

поскольку порядок конструирования и разрушения не определён (между отдельными юнитами, вообще говоря

и xaizek тоже пишет что

Не гарантирован порядок между единицами трансляции

То в общем теперь понятно почему гугл не рекомендует, и понятно что если в только в одной единице (а они именно в одной и будут) то всё ок. Можно сказать что вопрос решен - оставляю всё как есть, со спокойной совестью :)

Исправление bonta, :

И вообще, зачем тебе тут константа с конкатенацией, а не функция, её возвращающая?

Потому что хотелось бы избежать каждый раз конструирование строк, а так

std::string GetFoo() { return "Foo"; }

на сколько я знаю, будет вызываться конструктор всякий раз при вызове GetFoo. А если сделать const std::string &GetFoo() - то уже лишняя прослойка возвращающая всё тот же статик, хотя возможно и не лишняя, еще не совсем въехал в то что описал pon4ik

А их вообще не надо конструировать - объявляй их как char*. Конструирование кучи строк даёт ощутимый оверхед при старте приложения и, вообще говоря, не нужна.

Я заметил что в свои методы с сигнатурой void foo(const std::string &) я могу передавать const char* - но ведь тогда работает оператор приведения типа const char * -> std::string - что есть как раз, как мне кажется, лишняя трата производительности, чем при старте проконструировать, т.к. всякий раз когда передается си строка в ссылку на std строку, то вызывается конструктор std стрки. Кстати время старата как раз самое не приоритетное - приоритетно чтобы работало быстро (ну и код при этом не сильно сишный был, конечно :) )

Но если опереться на эти два высказывания:

поскольку порядок конструирования и разрушения не определён (между отдельными юнитами, вообще говоря

и xaizek тоже пишет что

Не гарантирован порядок между единицами трансляции

То в общем теперь понятно почему гугл не рекомендует, и понятно что если в только в одной единице (а они именно в одной и будут) то всё ок. Можно сказать что вопрос решен - оставляю всё как есть, со спокойной совестью :)

Исходная версия bonta, :

И вообще, зачем тебе тут константа с конкатенацией, а не функция, её возвращающая?

Потому что хотелось бы избежать каждый раз конструирование строк, а так

std::string GetFoo() { return "Foo"; }

на сколько я знаю, будет вызываться конструктор всякий раз при вызове GetFoo. А если сделать const std::string &GetFoo() - то уже лишняя прослойка возвращающая всё тот же статик, хотя возможно и не лишняя, еще не совсем въехал в то что описал pon4ik

А их вообще не надо конструировать - объявляй их как char*. Конструирование кучи строк даёт ощутимый оверхед при старте приложения и, вообще говоря, не нужна.

Я заметил что в свои методы с сигнатурой void foo(const std::string &) я могу передавать const char* - но ведь тогда работает оператор приведения типа const char * -> std::string - что есть как раз, как мне кажется, лишняя трата производительности, чем при старте проконструировать. Кстати время старата как раз самое не приоритетное - приоритетно чтобы работало быстро (ну и код при этом не сильно сишный был, конечно :) )

Но если опереться на эти два высказывания:

поскольку порядок конструирования и разрушения не определён (между отдельными юнитами, вообще говоря

и xaizek тоже пишет что

Не гарантирован порядок между единицами трансляции

То в общем теперь понятно почему гугл не рекомендует, и понятно что если в только в одной единице (а они именно в одной и будут) то всё ок. Можно сказать что вопрос решен - оставляю всё как есть, со спокойной совестью :)