Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.01.2012, 19:17   #21
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
там не будет ничего лишнего.
вы забываете так же про саму string::substr, она создает новый объект.
Я ничего не забываю. Я вам привел коды, которые используют только 1 копирование, вместо двух.

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
да лень, код должен быть удобен, а не предьявлять требование в виде out параметра(которого можно избежать)
Интересно, чем таким принципиальным отличается вариант:

Код:
std::string test; Foo(test);
от
Код:
std::string test = Foo();
Капризы программиста ценой производительности? Ну-ну.
_Bers вне форума Ответить с цитированием
Старый 19.01.2012, 19:23   #22
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Капризы программиста ценой производительности? Ну-ну.
в том то и дело, что не ценой.
вы вынесли создание объекта из функции и лишь.(копирование осталось)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 19.01.2012, 19:51   #23
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
в том то и дело, что не ценой.
вы вынесли создание объекта из функции и лишь.(копирование осталось)
Объект "источник" и объект "приёмник" в любом случае придётся создавать. Выдергивание подстроки в любом случае придётся делать.
Через substr, или через assign.

Штука вся в том, что бы количество копирований самих символов строки свести к минимуму.

Одно обязательное копирование произойдёт при выдергивании подстроки. А остальные могут произойти только в результате запуска копирующих конструкторов.

Ну так вот, мой подход гарантирует, что никаких левых запусков копирующих конструкторов не будет. Ваш - уповает на оптимизацию самого компилятора.

Например, 2008 студия в дебаг-версии запускает 1 лишний конструктор вот на таком коде:

Код:
class test
{
public:
    test() {std::cout<<"Constructor\n";}
    test(const test& rhs) { std::cout<<"Copy Constructor\n";}
    test Get() { test tmp; return tmp; }
};

test Foo(test& r) {  return r.Get(); }

int main() {   test t1;   test t2=Foo(t1); }
В релизе он конечно, оптимизирует этот момент. Вот только стоит ли уповать на компилятор, или все таки лучше писать компиляторо-независимый код?
_Bers вне форума Ответить с цитированием
Старый 19.01.2012, 20:06   #24
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Например, 2008 студия в дебаг-версии запускает 1 лишний конструктор вот на таком коде:
в дебаге практически вообще не делается оптимизаций, так как они могут ухучшить отладку.
а далее это идет базовая оптимизация возвращения обьекта.

просто не вижу причины выпендриваться рядом с тем же string::substr.
разработчики libstdc++ же не идиоты.

и далее, не путаем вызов конструктора копирования с вызовом конструктора, а затем оператора присваивания.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 19.01.2012, 20:14   #25
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
в дебаге практически вообще не делается оптимизаций, так как они могут ухучшить отладку.
а далее это идет базовая оптимизация возвращения обьекта.

просто не вижу причины выпендриваться рядом с тем же string::substr.
разработчики libstdc++ же не идиоты.

и далее, не путаем вызов конструктора копирования с вызовом конструктора, а затем оператора присваивания.
Не путаем.
_Bers вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Разделение данных одной ячейки jestya Microsoft Office Excel 4 29.09.2010 14:54
разделение данных в ячейках Viper_FMX Microsoft Office Excel 2 27.09.2010 02:43
Разделение данных на несколько ячеек d_adilet Microsoft Office Access 6 29.06.2010 09:28
Разделение массива данных на части Евгений К. Microsoft Office Excel 2 03.06.2010 13:41
Разделение. Maksim_27_10 Общие вопросы C/C++ 8 21.04.2010 20:40