У меня есть свой класс строки с подсчетом ссылок. И вот иногда сидишь и думаешь как передавать строку в функцию?
void f(const char *str);
или
void f(const String &str );
Вообщем то и то другое далеко от идеала.
В первом случае если строка в функции "запоминается" теряется преимущество подсчета ссылок, а во втором строка может только юзатся на чтение, и создание временного обьекта String (malloc + memcpy) не оправданно.
Идея заключается в том чтобы завести отдельный класс для передачи строкового параметра StrBox и писать всегда обнообразно не думая:
K>Вообщем то и то другое далеко от идеала. K>В первом случае если строка в функции "запоминается" теряется преимущество подсчета ссылок, а во втором строка может только юзатся на чтение, и создание временного обьекта String (malloc + memcpy) не оправданно.
Я может чего не понимаю, но чем плоха обычная передача ?
void f(String str);
"For every complex problem, there is a solution that is simple, neat,
and wrong."
> > Вообщем то и то другое далеко от идеала. > В первом случае если строка в функции "запоминается" теряется преимущество подсчета ссылок, а во втором строка может только юзатся на чтение, и создание временного обьекта String (malloc + memcpy) не оправданно.
[]
> P.S. Счастливые обладатели собственных string-велосипедов с подсчетом ссылок, могут заюзать и извлечь пользу. Для std::string такое не сделать.
Здравствуйте, AndrewJD, Вы писали:
AJD>Здравствуйте, Kluev, Вы писали:
AJD>Я может чего не понимаю, но чем плоха обычная передача ?
AJD>
AJD>void f(String str);
AJD>
тем что когда пишем f("zzzzz") или f(str), где str — const char*
будет создан временный обьект стринг, а это как правило malloc+strlen+memcpy. А когда это еще произходит и в цикле то имеем неслабый оверхед. К примеру грузится что-то из хмл:
// вызывается в циклеvoid Item::load( XmlNode &n )
{
this->val = n.attrib_int("Val"); // вот здесь оверхед на создание стрингthis->s = n.attrib_str("Zzz"); // и здес тоже
}
Все равно не понял.
K>тем что когда пишем f("zzzzz") или f(str), где str — const char* K>будет создан временный обьект стринг, а это как правило malloc+strlen+memcpy. А когда это еще произходит и в цикле то имеем неслабый оверхед. К примеру грузится что-то из хмл:
K>
K>// вызывается в цикле
K>void Item::load( XmlNode &n )
K>{
this->>val = n.attrib_int("Val"); // вот здесь оверхед на создание стрингthis->>s = n.attrib_str("Zzz"); // и здес тоже
K>}
K>
Если мы захотим внутри attrib_int работать со строкой, нам все равно необходимо создать String из StrBox. Так какая разница, когда будет создан этот новый стринг ?
"For every complex problem, there is a solution that is simple, neat,
and wrong."
K>>// вызывается в цикле
K>>void Item::load( XmlNode &n )
K>>{
this->val = n.attrib_int("Val"); // вот здесь оверхед на создание стрингthis->s = n.attrib_str("Zzz"); // и здес тоже
K>>}
K>>
AJD>Если мы захотим внутри attrib_int работать со строкой, нам все равно необходимо создать String из StrBox. Так какая разница, когда будет создан этот новый стринг ?
А если не захотим? А в данном пример 100% не захотим. Т.к. attrib_int не будет модифицировать строку, а использует ее как ключ для поиска в map-e. hash-e и т.п.