Russian Qt Forum

Qt => Общие вопросы => Тема начата: vertus от Октябрь 03, 2011, 21:44



Название: Implicit Sharing и QString
Отправлено: vertus от Октябрь 03, 2011, 21:44
Всем доброго времени суток!

В документации по Qt сказано, что QString относиться к Implicit Sharing классу. Это озночает, что до тех пор, пока мы в память с момента её инициализации ничего не записываем, она всегда копируется по указателю. Как только мы записываем в один из скопированных объектов что-то - только в этот момент создается копия в новой области памяти.

Однако, сделал вот такой простой опыт:

Код:

#include <QString>
#include <QDebug>

int main()
{
    QString str1 = "string";
    QString str2 = str1;

    return 0; // здесь поставил точку останова
}


И прошелся по памяти в дебагере и к моему удивлению обнаружил две копии моей строки!

Как это понимать?

Спасибо за внимание!


Название: Re: Implicit Sharing и QString
Отправлено: shirushizo от Октябрь 03, 2011, 21:52
В тонких материях не особо силен, но рискну предположить: может быть в дебаге и релизе поведение разное? ну вроде как для упрощения отладки или еще чего?


Название: Re: Implicit Sharing и QString
Отправлено: kibsoft от Октябрь 03, 2011, 21:54
Цитировать
Implicit sharing takes place behind the scenes; the programmer does not need to worry about it.
- из доки
Там не просто указатель передается..
QSharedDataPointer - почитайте про это, чтобы понять как там и что делается.


Название: Re: Implicit Sharing и QString
Отправлено: vertus от Октябрь 03, 2011, 21:58
Да понятно что не сам указатель, и что QSharedDataPointer используется. Но сути это не меняет, в памяти должен быть только один экземпляр. Возможно прав shirushizo, но как это проверить не знаю, в релиз версии дебагером не пройтись.


Название: Re: Implicit Sharing и QString
Отправлено: BRE от Октябрь 03, 2011, 22:17
И прошелся по памяти в дебагере и к моему удивлению обнаружил две копии моей строки!

Как это понимать?
Хотелось бы понять как ты "прошелся по памяти в дебагере", что пришел к такому выводу?
Куда указывают внутренние указатели d для каждой строки? Неужели на разные объекты?


Название: Re: Implicit Sharing и QString
Отправлено: LisandreL от Октябрь 03, 2011, 22:47
Одинаковый адрес (0x3e53f0 в моём случае).

Тут 3 варианта:
1) на вашей платформе, компиляторе, сборке и версии Qt это не поддерживается
2) вы привели не весь код и какая-то строчка заставила выполнить копирование (d->ref->_q_value чему равно?)
3) вы не умеете пользоваться дебаггером.


Название: Re: Implicit Sharing и QString
Отправлено: Igors от Октябрь 04, 2011, 06:01
И прошелся по памяти в дебагере и к моему удивлению обнаружил две копии моей строки!

Как это понимать?
"string" - тоже переменная (пусть и безымянная и изменить Вы ее не можете), поэтому в памяти она есть. И наоборот, str1 хранится в памяти как 2 байта на символ - в общем, проблемы с "прошелся"  :)

А то что экспериментируете и проверяете - это хорошо и правильно.


Название: Re: Implicit Sharing и QString
Отправлено: vertus от Октябрь 04, 2011, 09:00
Одинаковый адрес (0x3e53f0 в моём случае).

Тут 3 варианта:
1) на вашей платформе, компиляторе, сборке и версии Qt это не поддерживается
3) вы не умеете пользоваться дебаггером.

1). Провел тест на работе, создается только одна копия текста. Хотелось бы теперь выяснить, от чего это зависит? По сути implicit sharing не должен зависеть от платформы и компилятора.

3). Похоже что не умею. Как вы привели отображение переменных программы к виду как на картинке? Т.е. так, чтобы отображались и private члены класса.

И прошелся по памяти в дебагере и к моему удивлению обнаружил две копии моей строки!

Как это понимать?
"string" - тоже переменная (пусть и безымянная и изменить Вы ее не можете), поэтому в памяти она есть. И наоборот, str1 хранится в памяти как 2 байта на символ - в общем, проблемы с "прошелся"  :)

А то что экспериментируете и проверяете - это хорошо и правильно.

Прошелся, это значит открыл редактор памяти и посмотрел. Дома у меня рядом лежало две одинаковые строки и переменные str1 и str2 ссылались на них.

На работе только одна строка в памяти.

И там и там Qt 4.7.3, Windows 7.


Название: Re: Implicit Sharing и QString
Отправлено: kambala от Октябрь 04, 2011, 09:36
3). Похоже что не умею. Как вы привели отображение переменных программы к виду как на картинке? Т.е. так, чтобы отображались и private члены класса.
в настройках креатора выключить помощник отладчика


Название: Re: Implicit Sharing и QString
Отправлено: vertus от Октябрь 04, 2011, 09:44
3). Похоже что не умею. Как вы привели отображение переменных программы к виду как на картинке? Т.е. так, чтобы отображались и private члены класса.
в настройках креатора выключить помощник отладчика

Выключил, но отображение все равно по старому.