Russian Qt Forum
Ноябрь 06, 2024, 08:58 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Implicit Sharing и QString  (Прочитано 5290 раз)
vertus
Гость
« : Октябрь 03, 2011, 21:44 »

Всем доброго времени суток!

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

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

Код:

#include <QString>
#include <QDebug>

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

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


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

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

Спасибо за внимание!
Записан
shirushizo
Гость
« Ответ #1 : Октябрь 03, 2011, 21:52 »

В тонких материях не особо силен, но рискну предположить: может быть в дебаге и релизе поведение разное? ну вроде как для упрощения отладки или еще чего?
Записан
kibsoft
Хакер
*****
Offline Offline

Сообщений: 625


Просмотр профиля WWW
« Ответ #2 : Октябрь 03, 2011, 21:54 »

Цитировать
Implicit sharing takes place behind the scenes; the programmer does not need to worry about it.
- из доки
Там не просто указатель передается..
QSharedDataPointer - почитайте про это, чтобы понять как там и что делается.
Записан

http://kibsoft.ru - Download the Qt Media Encoding Library here

The apps that were written using QtMEL:
http://srecorder.com - Screen recording software
vertus
Гость
« Ответ #3 : Октябрь 03, 2011, 21:58 »

Да понятно что не сам указатель, и что QSharedDataPointer используется. Но сути это не меняет, в памяти должен быть только один экземпляр. Возможно прав shirushizo, но как это проверить не знаю, в релиз версии дебагером не пройтись.
Записан
BRE
Гость
« Ответ #4 : Октябрь 03, 2011, 22:17 »

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

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

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #5 : Октябрь 03, 2011, 22:47 »

Одинаковый адрес (0x3e53f0 в моём случае).

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

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Октябрь 04, 2011, 06:01 »

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

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

А то что экспериментируете и проверяете - это хорошо и правильно.
Записан
vertus
Гость
« Ответ #7 : Октябрь 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.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4746



Просмотр профиля WWW
« Ответ #8 : Октябрь 04, 2011, 09:36 »

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

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
vertus
Гость
« Ответ #9 : Октябрь 04, 2011, 09:44 »

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

Выключил, но отображение все равно по старому.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.122 секунд. Запросов: 23.