передача QString функции собственному классу |
Здравствуйте, гость ( Вход | Регистрация )
передача QString функции собственному классу |
Алексей1153 |
1.12.2010, 12:02
Сообщение
#21
|
фрилансер Группа: Участник Сообщений: 2941 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34 |
Так перегрузку или параметр по умолчанию про перегрузку myMethod(const QString &string); //тут можно передать ссылку на QString myMethod(const QString string); // а тут можно просто строку символов. Объект QString создастся и будет равносильно передаче по значению но зато гибко QString копирует данные, мфсишный CString себя так же ведёт Я однажды это для себя открыл вдруг - передал в функцию CString по значению, потом в функции редактировал внутренний буфер вручную. Хоп! Смотрю, внешний объект тоже поменялся )) Костыль - сначала явно скопировать в другой объект. |
|
|
Obey-Kun |
1.12.2010, 12:05
Сообщение
#22
|
Студент Группа: Участник Сообщений: 96 Регистрация: 24.3.2010 Пользователь №: 1556 Спасибо сказали: 3 раз(а) Репутация: 0 |
Да, забыл об implicit sharing.
Но в любом случае, для передачи объектов, sizeof которых больше sizeof указателя (а это ограничивается почти всеми стандартными типами и элементами enum'ов), в качестве аргументов, во всех методах в Qt применяются именно константные ссылки, куда ни глянь. Возможно, потому, что тут всё равно приходится совершать какие-никакие действия по копированию объекта. |
|
|
BRE |
1.12.2010, 12:06
Сообщение
#23
|
Профессионал Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: 44 |
Что-то я не пойму о чем речь?
И первый и второй метод спокойно можно вызывать так:
В обоих случаях будет создан временный объект QString. |
|
|
Obey-Kun |
1.12.2010, 12:08
Сообщение
#24
|
Студент Группа: Участник Сообщений: 96 Регистрация: 24.3.2010 Пользователь №: 1556 Спасибо сказали: 3 раз(а) Репутация: 0 |
Если ты о моём примере, то нет, при передаче по ссылке никакой копии создаваться не будет.
При передаче по копии, будет создана копия, но содержимое QString (буковки) не будут копироваться (из-за Impicit Sharing). Сообщение отредактировал Obey-Kun - 1.12.2010, 12:09 |
|
|
Алексей1153 |
1.12.2010, 12:09
Сообщение
#25
|
фрилансер Группа: Участник Сообщений: 2941 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34 |
BRE, да, но когда передаёшь QString, не происходить аллокации для строки, а когда передаётся строку символов, происходит создание объекта и аллокация памяти под копию буфера символов. Вот об этом речь
|
|
|
Obey-Kun |
1.12.2010, 12:11
Сообщение
#26
|
Студент Группа: Участник Сообщений: 96 Регистрация: 24.3.2010 Пользователь №: 1556 Спасибо сказали: 3 раз(а) Репутация: 0 |
По моему, чем делать заведомо менее эффективный метод для иллюзии удобства, лучше делать так:
|
|
|
Алексей1153 |
1.12.2010, 12:15
Сообщение
#27
|
фрилансер Группа: Участник Сообщений: 2941 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34 |
Obey-Kun, визуальное загромождение кода тоже мало способствует удобству Мы же знаем, что QString так работает (да и сами разработчики так его применяют - это о чём-то говорит).
А в общем случае, конечно, по ссылке или по указателю большие объекты передавать следует. За исключением случаев, когда внутренний объект будет меняться - тогда проще сразу на стеке его и создать |
|
|
BRE |
1.12.2010, 12:15
Сообщение
#28
|
Профессионал Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: 44 |
Если методу нужен в качестве параметра QString, то по любому нужно создавать объект.
А передача константной ссылки всегда "легче" чем передача по значению, хотя с классами используемыми implicit sharing это и не так явно. |
|
|
Obey-Kun |
1.12.2010, 12:20
Сообщение
#29
|
Студент Группа: Участник Сообщений: 96 Регистрация: 24.3.2010 Пользователь №: 1556 Спасибо сказали: 3 раз(а) Репутация: 0 |
Obey-Kun, визуальное загромождение кода тоже мало способствует удобству Мы же знаем, что QString так работает (да и сами разработчики так его применяют - это о чём-то говорит). А в общем случае, конечно, по ссылке или по указателю большие объекты передавать следует. За исключением случаев, когда внутренний объект будет меняться - тогда проще сразу на стеке его и создать Поищите, например, setName в документации. Да у них там везде QString передаётся по константной ссылке. Абсолютно везде. При создании копии QString, несмотря на общее использование данных, кое-какие лишние действия всё равно будут проводиться. Цитата А передача константной ссылки всегда "легче" чем передача по значению, хотя с классами используемыми implicit sharing это и не так явно. Вот именно. Но разница всё равно есть. И разработчики Qt, видимо, посчитали её значительной, иначе в собственных методах использовали бы передачу QString по значению. Сообщение отредактировал Obey-Kun - 1.12.2010, 12:21 |
|
|
Алексей1153 |
1.12.2010, 12:31
Сообщение
#30
|
фрилансер Группа: Участник Сообщений: 2941 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34 |
Obey-Kun, непонятно, о чём такой долгий спор Всем и так известно, что ссылка (или указатель) передаётся быстрее и меньше стека есть. Думаешь, Антарктиду открыл ?
Только в каждом случае , когда пишешь свою функцию, нужно продумывать интерфейс, так как тупо всегда ссылку или указатель нельзя передавать. Бывает так, что надо именно объект, чтобы он сразу скопировался |
|
|
Текстовая версия | Сейчас: 4.12.2024, 16:47 |