crossplatform.ru

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


  Ответ в Необычное использование new
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

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


Последние 10 сообщений [ в обратном порядке ]
Litkevich Yuriy Дата 14.2.2011, 12:33
 
Цитата(Rocky @ 14.2.2011, 14:08) *
это сделано для всех классов
для многих, но не для всех (QPoint, ...).
Rocky Дата 14.2.2011, 12:08
 
Цитата(Litkevich Yuriy @ 12.2.2011, 13:56) *
В Qt есть один нюанс: тип QString - тип с неявным разделением данных. И когда происходит передача по значению, реального копирования содержимого не происходит. Копирование происходит только при изменении оригинала или "копии". Это позволяет экономить время на копирование.
Сделано так потому, что этот тип очень часто используется.

Насколько я знаю, это сделано для всех классов, которые не наследуются от QObject. Подробнее гуглить по словам implicit sharing.
Litkevich Yuriy Дата 12.2.2011, 12:56
 
Цитата(dsp @ 10.2.2011, 22:54) *
Правая ее часть выделяет в куче место под неименованную переменную типа typeName и возвращает на нее указатель(адрес). Лева часть принимает этот адрес и хранит в pname.
тут ты важный момент упустил - не просто место выделяет в куче, а создаёт объек, и указатель возвращает на созданный объект.

Цитата(dsp @ 11.2.2011, 3:40) *
И везде в официальных примерах передача идет по значению, а в документации по ссылке! почему?
В Qt есть один нюанс: тип QString - тип с неявным разделением данных. И когда происходит передача по значению, реального копирования содержимого не происходит. Копирование происходит только при изменении оригинала или "копии". Это позволяет экономить время на копирование.
Сделано так потому, что этот тип очень часто используется.
Алексей1153 Дата 11.2.2011, 8:09
  что гадать, легко проверить , сколько байтов занимает QString в стеке, когда передаётся по значению :)

void F(int i1, const QString txt, int i2)
{
    const void* beg=0;
    const void* end=0;
    if(&i2>&i1)
    {
        beg=(&i1+1); //начало txt
        end=&i2; //конец txt+1
    }
    else
    {
        beg=&i2; //начало txt
        end=(&i1+1); //конец txt+1
    }
    
    
    int diff=int(end)-int(beg);// == 4
}

F(0,"123456789123456789123456789123456789",0);
Iron Bug Дата 11.2.2011, 7:57
  как всё запущено...
в приведённом куске кода (неважно, QT это или нет) выделяются динамические объекты, которые останутся в памяти после выхода из процедуры, которая их создала. и смысл передачи указателей в данном случае в том, чтобы объект layout остался инициализированным и после выхода из данного куска кода, до явного уничтожения созданных объектов. с локальными строками пример не проканает, ибо строки будут локальными и тупо исчезнут после выхода из процедуры, а указатели на них повиснут в неизвестности.
slav Дата 11.2.2011, 2:07
 
Цитата(dsp @ 11.2.2011, 1:40) *
Не оговорились "Т.е. передача по ссылке, и по значению."?


не хочу завести в заблуждение, но я думаю, что именно так.
Тут есть кусок про QString
http://noasfera.com/?tag=qstring
Цитата(dsp @ 11.2.2011, 1:40) *
И везде в официальных примерах передача идет по значению, а в документации по ссылке! почему?

в документации указываеться для защиты и более ефективного использования, а в официальных примерах там же если и передается строка, то она маленькой длины.
dsp Дата 11.2.2011, 1:40
 
Цитата(slav @ 11.2.2011, 0:44) *
Притом если передать const QString text - то будет создана его копия и помещена в стек. Т.е. передача по ссылке, и по значению.


Не оговорились "Т.е. передача по ссылке, и по значению."?

QLabel(const QString text, ...) - из этого я вижу передачу только по значению в виде копии!

И везде в официальных примерах передача идет по значению, а в документации по ссылке! почему?
slav Дата 11.2.2011, 0:44
 
Цитата(dsp @ 10.2.2011, 20:54) *
И еще, многие конструкторы принимают в качестве параметра

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
 
Цитата(dsp @ 10.2.2011, 20:54) *
Т.е. этот способ можно применять, когда (?) нам не нужно в дальнейшем производить какие-то манипуляции с виджетами?
Да.

Чем оно необычное? Просто мне не до конца понятно.
А вообще мне кажется, что если ты в мозгу попробуешь выстроить доказательство необычности данного использования, то поймешь, что оно вовсе не необычное! И еще, этот вопрос я думаю больше относится не столько к Qt, сколько к С++. :)
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 28.3.2024, 15:28