Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Зачем копия обьекта возращенного из функции присваивается ссылке?
|
|||
|---|---|---|---|
|
#18+
Часто встречаю такой код в обычный методах класа: Код: plaintext 1. обьясните зачем присваевать ссылке копию?А не просто написать Код: plaintext 1. И еще вопрос зачем в cpp файле пишут такое Код: plaintext 1. ,зачем оборачивать в безымянный немспейс в cpp файле мы все равно его не увидим, и какая разница в записи Код: plaintext 1. что лучше использовать и в каких случаях? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2012, 17:39 |
|
||
|
Зачем копия обьекта возращенного из функции присваивается ссылке?
|
|||
|---|---|---|---|
|
#18+
Katamaran1987, 1) Константная ссылка позволяет избежать фактического копирования возвращаемого объекта если функция возвращает ссылку. Одновременно, если ф-я возвращает копию, то константная ссылка указывает компилятору хранить временное значение пока ссылка не выйдет из области видимости. Т.е. это позволяет не задумываться возвращается ли ссылка или сам объект и при этом получать максимально быстрый код и обходиться без утечек памяти. 2) анонимный namespace - это более общий случай static. В большинстве случаев - взаимозаменяемы (если не рассматривать такие детали как вложенные неймспейсы и аргументозависимый поиск неквалифицированных функций). Константы неявно создаются как static поэтому можно не указывать static ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2012, 17:55 |
|
||
|
Зачем копия обьекта возращенного из функции присваивается ссылке?
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyKatamaran1987, 1) Константная ссылка позволяет избежать фактического копирования возвращаемого объекта если функция возвращает ссылку. Функция возращает не ссылку зачем тогда присваивать ссылке? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2012, 18:00 |
|
||
|
Зачем копия обьекта возращенного из функции присваивается ссылке?
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyKatamaran1987, это позволяет не задумываться возвращается ли ссылка или сам объект и при этом получать максимально быстрый код и обходиться без утечек памяти.Это какие еще утечки const QString plainText = ui.textEdit->toPlainText(); в этом коде? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2012, 18:08 |
|
||
|
Зачем копия обьекта возращенного из функции присваивается ссылке?
|
|||
|---|---|---|---|
|
#18+
Katamaran1987, Я же написал - если возвращается ссылка, то копировать во временный объект нет никакого смысла. Во многих АПИ не описано что именно будет возвращаться - ссылка или объект, чтобы у имплементоров библиотеки была свобода маневра для оптимизаций. Утечки могут быть если вы не константные ссылки будете использовать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2012, 18:12 |
|
||
|
Зачем копия обьекта возращенного из функции присваивается ссылке?
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyKatamaran1987, Утечки могут быть если вы не константные ссылки будете использовать.Не понимаю можно пример? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2012, 18:15 |
|
||
|
Зачем копия обьекта возращенного из функции присваивается ссылке?
|
|||
|---|---|---|---|
|
#18+
Еще насчет разницы между анонимным неймспейсом и статик. Объекты объявленные в анонимном неймспейсе видны за пределами единицы трансляции (под уникальными именами, но видны), а объекты объявленные статик - за пределами не видны вообще. С практической точки зрения это должно иметь значение при инстанцировании шаблонов, но я на практике никогда не сталкивался с проблемами из-за статиков. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2012, 18:17 |
|
||
|
Зачем копия обьекта возращенного из функции присваивается ссылке?
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyKatamaran1987, Во многих АПИ не описано что именно будет возвращаться - ссылка или объект, чтобы у имплементоров библиотеки была свобода маневра для оптимизаций. Другими словами этот код является универсальным и быстрым const QString &plainText = ui.textEdit->toPlainText();? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2012, 18:27 |
|
||
|
Зачем копия обьекта возращенного из функции присваивается ссылке?
|
|||
|---|---|---|---|
|
#18+
Katamaran1987Anatoly MoskovskyKatamaran1987, Утечки могут быть если вы не константные ссылки будете использовать.Не понимаю можно пример? Некоторые компиляторы позволяли временные значения присваивать в неконстантные ссылки и не следили за временем жизни. Пример не могу привести, под рукой нет того старья. Впрочем я допускаю что про утечки я неверно помню, и может их и нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2012, 18:29 |
|
||
|
Зачем копия обьекта возращенного из функции присваивается ссылке?
|
|||
|---|---|---|---|
|
#18+
Katamaran1987Другими словами этот код является универсальным и быстрым const QString &plainText = ui.textEdit->toPlainText();? да ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2012, 18:30 |
|
||
|
Зачем копия обьекта возращенного из функции присваивается ссылке?
|
|||
|---|---|---|---|
|
#18+
Katamaran1987, Проще говоря, короткая жизнь временной переменной которая возвращается из функции немного продлевается, а именно до конца жизни самой константной ссылки. Это явно указанный стандартом прием продления жизни временных объектов. Это нужно чтобы избежать накладных расходов на создание копии временного объекта. Если бы его не было, а был вариант указанный вами, тогда временный объект полученный из функции, копировался бы в целевой объект вызовом конструктора копирования, затем после окончания присваивания удалялся бы, вызывался деструктор временного объекта, освобождалась бы память занятая им, а это куча накладных расходов. А с константной ссылкой всего этого не происходит, временный объект "зацепляется" ссылкой и не "умирает" пока она не выходит из области своей видимости, и вы фактически работаете с возвращенным временным объектом. Но все это ветряные мельницы, и поэтому я бы не стал это называть универсальным и быстрым способом, так как обычно нужно запоминать то, что функция вернула, и рано или поздно придется все же скопировать объект. Кроме того для QString это совсем небольшие константные расходы, так как это copy-on-change объект, и копирования не произойдет. Кроме того компилятор может оптимизировать возвращаемое значение, и без константной ссылки, и копирования на самом деле чаще всего не будет вовсе. Кроме того скоро все перейдет на move семантику, и эта "фича" и вовсе может кануть в лету. Anatoly Moskovsky, еще unnamed namespace-ы очень удобны для упрятывания в них вспомогательных типов, функций, объектов (они конечно чаще признак плохого дизайна, но все же). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2012, 18:45 |
|
||
|
Зачем копия обьекта возращенного из функции присваивается ссылке?
|
|||
|---|---|---|---|
|
#18+
On 08/16/2012 07:00 PM, Katamaran1987 wrote: > Функция возращает не ссылку зачем тогда присваивать ссылке? А почему бы и нет ? Собственно, что тебя смущает ? Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2012, 21:24 |
|
||
|
Зачем копия обьекта возращенного из функции присваивается ссылке?
|
|||
|---|---|---|---|
|
#18+
MasterZivOn 08/16/2012 07:00 PM, Katamaran1987 wrote: > Функция возращает не ссылку зачем тогда присваивать ссылке? А почему бы и нет ? Собственно, что тебя смущает ? Ну я почему то считал если функция возращает ссылку тогда и принимать я должен ссылку, и соответственно если возращает копию то и принимать копию. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2012, 09:31 |
|
||
|
Зачем копия обьекта возращенного из функции присваивается ссылке?
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyКонстанты неявно создаются как static поэтому можно не указывать static Я правильно понял? Код: plaintext 1. 2. 3. 4. В cpp файле и в h? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.12.2012, 15:21 |
|
||
|
Зачем копия обьекта возращенного из функции присваивается ссылке?
|
|||
|---|---|---|---|
|
#18+
Katamaran1987Anatoly MoskovskyКонстанты неявно создаются как static поэтому можно не указывать static Я правильно понял? Код: plaintext 1. 2. 3. 4. В cpp файле и в h? Это - да: Код: plaintext 1. Единственное, это относится только к нелокальным константам. Локальные (объявленные в теле функции) не делаются статическими без явного указания. Я не понял вопроса "В cpp файле и в h?" Между cpp и h нет никакой разницы, кроме того что h обычно включаются разными cpp. В этом случае константа объявленная в таком хедере в каждой единице трансляции будет физически отдельной "переменной" (это относится к любым глобальным статическим переменным). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.12.2012, 15:54 |
|
||
|
Зачем копия обьекта возращенного из функции присваивается ссылке?
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyЯ не понял вопроса "В cpp файле и в h?" Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Правильно я считаю? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.12.2012, 16:23 |
|
||
|
Зачем копия обьекта возращенного из функции присваивается ссылке?
|
|||
|---|---|---|---|
|
#18+
Katamaran1987Правильно я считаю? Нет. Я ж выше написал - константы неявно статические. Поэтому дублирования при связывании не будет. И поэтому же через extern нельзя импортировать константу объявленную в другой единице трансляции. Импорт констант делается через объявление их в хедере и его включение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.12.2012, 18:40 |
|
||
|
|

start [/forum/topic.php?fid=57&fpage=86&tid=2020548]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
38ms |
get topic data: |
14ms |
get forum data: |
3ms |
get page messages: |
68ms |
get tp. blocked users: |
2ms |
| others: | 13ms |
| total: | 169ms |

| 0 / 0 |
