crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )


  Ответ в передача QString функции собственному классу
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
Теги
Выровнять по центру
Ссылка на тему
Ссылка на сообщение
Скрытый текст
Сокращение
Код с подсветкой
Offtopic
 
Удалить форматирование
Спец. элементы
Шрифт
Размер
 
Цвет шрифта
 
Отменить ввод
Вернуть ввод
Полужирный
Курсив
Подчеркнутый
 
 
Смайлики
Вставить изображение
Вставить адрес электронной почты
Цитата
Код
Раскрывающийся текст
 
Увеличить отступ
По левому краю
По центру
По правому краю
Вставить список
Вставить список

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
Алексей1153 Дата 1.12.2010, 12:31
  Obey-Kun, непонятно, о чём такой долгий спор :) Всем и так известно, что ссылка (или указатель) передаётся быстрее и меньше стека есть. Думаешь, Антарктиду открыл ? ;)
Только в каждом случае , когда пишешь свою функцию, нужно продумывать интерфейс, так как тупо всегда ссылку или указатель нельзя передавать. Бывает так, что надо именно объект, чтобы он сразу скопировался
Obey-Kun Дата 1.12.2010, 12:20
 
Цитата(Алексей1153 @ 1.12.2010, 12:15) *
Obey-Kun, визуальное загромождение кода тоже мало способствует удобству :) Мы же знаем, что QString так работает (да и сами разработчики так его применяют - это о чём-то говорит).
А в общем случае, конечно, по ссылке или по указателю большие объекты передавать следует. За исключением случаев, когда внутренний объект будет меняться - тогда проще сразу на стеке его и создать


Поищите, например, setName в документации. Да у них там везде QString передаётся по константной ссылке. Абсолютно везде.
При создании копии QString, несмотря на общее использование данных, кое-какие лишние действия всё равно будут проводиться.

Цитата
А передача константной ссылки всегда "легче" чем передача по значению, хотя с классами используемыми implicit sharing это и не так явно.

Вот именно. Но разница всё равно есть. И разработчики Qt, видимо, посчитали её значительной, иначе в собственных методах использовали бы передачу QString по значению.
BRE Дата 1.12.2010, 12:15
  Если методу нужен в качестве параметра QString, то по любому нужно создавать объект.
А передача константной ссылки всегда "легче" чем передача по значению, хотя с классами используемыми implicit sharing это и не так явно.
Алексей1153 Дата 1.12.2010, 12:15
  Obey-Kun, визуальное загромождение кода тоже мало способствует удобству :) Мы же знаем, что QString так работает (да и сами разработчики так его применяют - это о чём-то говорит).
А в общем случае, конечно, по ссылке или по указателю большие объекты передавать следует. За исключением случаев, когда внутренний объект будет меняться - тогда проще сразу на стеке его и создать
Obey-Kun Дата 1.12.2010, 12:11
  По моему, чем делать заведомо менее эффективный метод для иллюзии удобства, лучше делать так:
myFunc(const QString &string) {
    qDebug() << string;
}

QString s("tatata");
myFunc(s);
myFun(QString("nanana"));
Алексей1153 Дата 1.12.2010, 12:09
  BRE, да, но когда передаёшь QString, не происходить аллокации для строки, а когда передаётся строку символов, происходит создание объекта и аллокация памяти под копию буфера символов. Вот об этом речь
Obey-Kun Дата 1.12.2010, 12:08
  Если ты о моём примере, то нет, при передаче по ссылке никакой копии создаваться не будет.
При передаче по копии, будет создана копия, но содержимое QString (буковки) не будут копироваться (из-за Impicit Sharing).
BRE Дата 1.12.2010, 12:06
  Что-то я не пойму о чем речь?
И первый и второй метод спокойно можно вызывать так:
myMethod( "text" );


В обоих случаях будет создан временный объект QString.
Obey-Kun Дата 1.12.2010, 12:05
  Да, забыл об implicit sharing.

Но в любом случае, для передачи объектов, sizeof которых больше sizeof указателя (а это ограничивается почти всеми стандартными типами и элементами enum'ов), в качестве аргументов, во всех методах в Qt применяются именно константные ссылки, куда ни глянь.

Возможно, потому, что тут всё равно приходится совершать какие-никакие действия по копированию объекта.
Алексей1153 Дата 1.12.2010, 12:02
 
Цитата(Obey-Kun @ 1.12.2010, 12:54) *
Так перегрузку или параметр по умолчанию

про перегрузку

myMethod(const QString &string); //тут можно передать ссылку на QString
myMethod(const QString string); // а тут можно просто строку символов. Объект QString создастся и будет равносильно передаче по значению

но зато гибко :)





Цитата(Litkevich Yuriy @ 1.12.2010, 13:22) *
QString копирует данные,

мфсишный CString себя так же ведёт :) Я однажды это для себя открыл вдруг - передал в функцию CString по значению, потом в функции редактировал внутренний буфер вручную. Хоп! Смотрю, внешний объект тоже поменялся )) Костыль - сначала явно скопировать в другой объект.
Просмотр темы полностью (откроется в новом окне)
RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 12.7.2025, 1:01