конструктор с переменным числом аргументов...

Тема в разделе "LANGS.C", создана пользователем cupuyc, 4 сен 2009.

  1. cupuyc

    cupuyc New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2009
    Сообщения:
    763
    вот думаю - насколько это приемлемо. вообще, для строк довольно удобно:
    Код (Text):
    1. CString(unsigned int n_strings, CString *s1, ...) {...}
    можно, конечно, склеивать по отдельности
    Код (Text):
    1. res = s1 + s2 + ...;
    но, не очень оптимально - каждый оператор будет перекраивать кучу, копировать строки, а тут за один раз получаешь то, что нужно...
     
  2. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    cupuyc

    Это совершенно неприемлемо :)
     
  3. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    cupuyc
    в С++ это не имеет смысла, т.к. не дает никакой оптимизации

    но можно перегрузить конструктор для каждого числа строк
     
  4. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    юзай
    CString res(s1+s2+s3+...sn);
     
  5. cupuyc

    cupuyc New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2009
    Сообщения:
    763
    как это не даёт? допустим нужно подсчитать s1+s2+s3:
    вызывается s1.operator+(s2.operator+(s3)), что превращается в выделение памяти для s2+s3, затем для s1+ (s2+s3).

    если же я определю конструктор (CString *s1, CString *s2, ...), то я могу за один проход выделить память под все строки и скопировать их.
     
  6. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    cupuyc

    Так-то оно так, вот только в 99% случаев если операция сложения строк в твоей программе вдруг стала ботлнеком, то тебе остается только застрелиться :)

    В особо экзотических задачах, где это реально perfomance-critical операция, можно для операций со стоками написать шаблоны выражений. См. Дэвид Вандевурд, Николай М. Джосаттис, "Шаблоны C++. Справочник разработчика".

    http://www.ozon.ru/context/detail/id/3960662/
     
  7. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Зачем обязательно конструктор? Почему не сделать отдельный метод как в mfc CString::Format? Ещё есть такая штука как отложенные вычисления - Ускорение вычислений при перегрузке бинарных операторов Можно немного расширить концепцию, например в SumString(к примеру) хранить не два указателя, а список, и определить оператор суммы строки и SumString.
     
  8. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Booster

    Шаблоны выражений это оно и есть, только в более православной форме :)
     
  9. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    _DEN_
    Согласен, это такой шаблон проектирования. Как не назови, суть одно.
     
  10. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Booster

    Кстати, интуиция и здравый смысл подсказывают, что у компилятора будет больше простора для оптимизации, если хранить на операнды ссылки, а не указатели.
     
  11. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    _DEN_
    Хотя если ты имел шаблоны С++, то это ни сколько не православно.
     
  12. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    _DEN_
    Ты про инлайн оптимизацию? Возможно.
     
  13. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Booster

    Я имел ввиду тот заворачивающий моск механизм, который описан в книге. В других источниках я такого не видел, поэтому не могу утверждать что этому есть какое-то устоявшееся название.
     
  14. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    _DEN_
    Я же имел ввиду не какой-то механизм, а идею - паттерн "отложенные вычисления".
     
  15. cupuyc

    cupuyc New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2009
    Сообщения:
    763
    не понял. а что делать, если нужен форматный вывод? как обойтись без копирования строк? вообще говоря, я хочу чтобы сорец выглядел красиво и при этом качество кода было высоким. понятно, что вместо CString можно юзать указатели и работать с буферами, но тогда как фигово будут выглядеть сорцы... вот я и ищу более-менее приемлемый вариант.
     
  16. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    cupuyc

    CString - это уже не красиво :)
     
  17. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    У CString есть Format. Чем не устраивает?
     
  18. cupuyc

    cupuyc New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2009
    Сообщения:
    763
    посодержательней? что тут некрасивого? если Вы думаете, что я юзаю mfc - то это не так. название класса - просто абстракция, чтобы было понятно о чём идёт речь.
     
  19. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Юзай sprintf, наш искатель прекрасного.
     
  20. cupuyc

    cupuyc New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2009
    Сообщения:
    763
    у моего CString нет Format - и собрать его мне не оч хочется. мне вполне хватит glue_strings.

    На самом деле, мне вообще интересно не столько конкретный случай, сколько сам подход - юзать методы с переменным числом аргументов: