Здравствуйте, гость ( Вход | Регистрация )
Litkevich Yuriy | Дата 14.2.2011, 12:33 |
это сделано для всех классов для многих, но не для всех (QPoint, ...). |
|
Rocky | Дата 14.2.2011, 12:08 |
В Qt есть один нюанс: тип QString - тип с неявным разделением данных. И когда происходит передача по значению, реального копирования содержимого не происходит. Копирование происходит только при изменении оригинала или "копии". Это позволяет экономить время на копирование. Сделано так потому, что этот тип очень часто используется. Насколько я знаю, это сделано для всех классов, которые не наследуются от QObject. Подробнее гуглить по словам implicit sharing. |
|
Litkevich Yuriy | Дата 12.2.2011, 12:56 |
Правая ее часть выделяет в куче место под неименованную переменную типа typeName и возвращает на нее указатель(адрес). Лева часть принимает этот адрес и хранит в pname. тут ты важный момент упустил - не просто место выделяет в куче, а создаёт объек, и указатель возвращает на созданный объект.И везде в официальных примерах передача идет по значению, а в документации по ссылке! почему? В Qt есть один нюанс: тип QString - тип с неявным разделением данных. И когда происходит передача по значению, реального копирования содержимого не происходит. Копирование происходит только при изменении оригинала или "копии". Это позволяет экономить время на копирование.Сделано так потому, что этот тип очень часто используется. |
|
Алексей1153 | Дата 11.2.2011, 8:09 |
что гадать, легко проверить , сколько байтов занимает QString в стеке, когда передаётся по значению
|
|
Iron Bug | Дата 11.2.2011, 7:57 |
как всё запущено... в приведённом куске кода (неважно, QT это или нет) выделяются динамические объекты, которые останутся в памяти после выхода из процедуры, которая их создала. и смысл передачи указателей в данном случае в том, чтобы объект layout остался инициализированным и после выхода из данного куска кода, до явного уничтожения созданных объектов. с локальными строками пример не проканает, ибо строки будут локальными и тупо исчезнут после выхода из процедуры, а указатели на них повиснут в неизвестности. |
|
slav | Дата 11.2.2011, 2:07 |
Не оговорились "Т.е. передача по ссылке, и по значению."? не хочу завести в заблуждение, но я думаю, что именно так. Тут есть кусок про QString http://noasfera.com/?tag=qstring И везде в официальных примерах передача идет по значению, а в документации по ссылке! почему? в документации указываеться для защиты и более ефективного использования, а в официальных примерах там же если и передается строка, то она маленькой длины. |
|
dsp | Дата 11.2.2011, 1:40 |
Притом если передать const QString text - то будет создана его копия и помещена в стек. Т.е. передача по ссылке, и по значению. Не оговорились "Т.е. передача по ссылке, и по значению."? QLabel(const QString text, ...) - из этого я вижу передачу только по значению в виде копии! И везде в официальных примерах передача идет по значению, а в документации по ссылке! почему? |
|
slav | Дата 11.2.2011, 0:44 |
И еще, многие конструкторы принимают в качестве параметра const QString & text , т.е. ссылку на надпись ( Qlabel(const QString & text, ... ) ). В примерах я смотрю и вижу, что в одном месте передают текст через ссылку, в другом просто const QString text , хотя в документации ясно указано, как надо. Почему так происходит? В документации указано что надо передавать указатель, потому что он будет занимать меньше места в стеке чем вся строка. Притом если передать const QString text - то будет создана его копия и помещена в стек. Т.е. передача по ссылке, и по значению. |
|
dsp | Дата 10.2.2011, 22:56 |
Просто я никогда не видел подобного использования new. Вот и захотелось спросить. И да, данный вариант мне нравиться. Просто у меня в головек куча мелочей, "которые не дают мне жить =)". И если я про них не спрошу сейчас, то в дальнейшем ком их только возрастет и будет лишь иллюзия понимания, а мне важна уверенность! |
|
ViGOur | Дата 10.2.2011, 22:47 |
Т.е. этот способ можно применять, когда (?) нам не нужно в дальнейшем производить какие-то манипуляции с виджетами? Да.Чем оно необычное? Просто мне не до конца понятно. А вообще мне кажется, что если ты в мозгу попробуешь выстроить доказательство необычности данного использования, то поймешь, что оно вовсе не необычное! И еще, этот вопрос я думаю больше относится не столько к Qt, сколько к С++. |
|
Просмотр темы полностью (откроется в новом окне) | |
Текстовая версия | Сейчас: 29.3.2024, 12:24 |