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