Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
А где создание объекта
|
|||
|---|---|---|---|
|
#18+
Делаю первые шаги в Куте. Нашел пример как показать messagebox Код: plaintext 1. 2. 3. Я ожидал увидеть что то типа: Код: plaintext 1. Возник вопрос как это тогда работает без создания объекта, т.е. мы имеем просто ссылку msgBox а объекта нет ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2014, 01:46 |
|
||
|
А где создание объекта
|
|||
|---|---|---|---|
|
#18+
Тут тебе не паскаль. msgBox - в натуре объект, а не какая-то там ссылка. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2014, 02:08 |
|
||
|
А где создание объекта
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovТут тебе не паскаль. msgBox - в натуре объект, а не какая-то там ссылка. Дима - запарил ))) Вопрос адресован был к кутешникам ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2014, 02:21 |
|
||
|
А где создание объекта
|
|||
|---|---|---|---|
|
#18+
Почитал в доке куте, что QMessageBox msgBox; фактически создает статический объект в стеке. кутеAs you have recognized already there are different ways to use QMessageBox. The static method is for displaying a message box quickly. IMHO it is more a matter of taste and preference which you are using. However, the non-static methods you are referring are different from the location where you are placing the instance. The first method uses the stack for the complete object. The second method is using the heap Так в принципе понятно, идем дальше, самое интересное в словах кутеThe first method uses the stack for the complete object. Открываю исходники QMessageBox.h и ищу слово static. В итоге ничего напоминающего на создание статического объекта в стеке - нет. Т.е. я ожидал что статический стековый объект - будет глобальным stackoverflowA static variable is basically a global variable, even if you cannot access it globally. Usually there is an address for it that is in the executable itself. There is only one copy for the entire program. No matter how many times you go into a function call (or class) (and in how many threads!) the variable is referring to the same memory location. И поэтому использование Код: plaintext 1. плохой тон ввиду потоков и проч, ввиду того что объект один глобально. Поправьте меня если я не прав. После этого не охота практиковать использование QMessageBox без new. Также получается что фраза из приведенного выше текста автор.. uses the stack for the complete object .. не верна. Потому что объект static variable is basically a global variable - т.е. объект все таки в хипе, а ссылка на него в стеке - так ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2014, 03:32 |
|
||
|
А где создание объекта
|
|||
|---|---|---|---|
|
#18+
Judo, Слово "статический" в тех цитатах, что вы привели, относится к методам, а не объекту. А чтобы создать статический объект нужно явно указать static при его объявлении. Более того, нельзя вообще создать "статический объект в стеке". Можно либо в стеке либо статический. Таким образом ваши выводы про глобальность объекта, проблемы с потоками и пр. не соответствуют действительности. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2014, 05:41 |
|
||
|
А где создание объекта
|
|||
|---|---|---|---|
|
#18+
Объекты создаются либо статически (при компиляции вы заранее знаете, что этот объект точно будет нужен) либо динамически (в процессе работы программы, но может и не понадобиться), статические объекты размещаются в стеке, динамические в куче. QMessageBox msgBox; - это статическое создание объекта в стеке. QMessageBox mb = new QMessageBox(); - это динамическое создание объекта в куче. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2014, 15:47 |
|
||
|
А где создание объекта
|
|||
|---|---|---|---|
|
#18+
Sheraton, Откуда вы эту терминологию берете :) По месту выделения памяти для данных объекты делятся на - автоматические (в стеке) - статические (в глобальном сегменте данных) - динамические (в куче) Ни в каком другом смысле слово "статический" по отношению к объектам в С/С++ не применяется. И поэтому ни при каких обстоятельствах статические объекты не могут размещаться в стеке. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2014, 16:21 |
|
||
|
А где создание объекта
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskySheraton, Откуда вы эту терминологию берете :) По месту выделения памяти для данных объекты делятся на - автоматические (в стеке) - статические (в глобальном сегменте данных) - динамические (в куче) Ни в каком другом смысле слово "статический" по отношению к объектам в С/С++ не применяется. И поэтому ни при каких обстоятельствах статические объекты не могут размещаться в стеке. Это уже детали. Для новичка изучающего С++ лучше простое объяснение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2014, 16:38 |
|
||
|
А где создание объекта
|
|||
|---|---|---|---|
|
#18+
И кстати это не моя терминология. Это из книги Липпмана "Язык программирования С++. Вводный курс" Издательство "Невский Диалект", 2003 год. стр.50. "В С++ объекты могут быть размещены либо статически - во время компиляции, либо динамически - во время выполнения программы, путем вызова функций из стандартной библиотеки. Основная разница в использовании этих методов - в их эффективности. Статическое размещение более эффективно, так как выделение памяти происходит до выполнения программы, однако оно гораздо менее гибко, потому что мы должны заранее знать тип и размер размещаемого объекта." ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2014, 16:48 |
|
||
|
А где создание объекта
|
|||
|---|---|---|---|
|
#18+
SheratonЭто уже детали. Для новичка изучающего С++ лучше простое объяснение. Это не детали. Там выше чел уже запутался и искал глобальные объекты там, где их нет, именно из-за неуместного употребления термина "статический" по отношению к методу создания объектов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2014, 16:48 |
|
||
|
А где создание объекта
|
|||
|---|---|---|---|
|
#18+
SheratonИ кстати это не моя терминология. Это из книги Липпмана "Язык программирования С++. Вводный курс" Издательство "Невский Диалект", 2003 год. стр.50. "В С++ объекты могут быть размещены либо статически - во время компиляции, либо динамически - во время выполнения программы, путем вызова функций из стандартной библиотеки. Основная разница в использовании этих методов - в их эффективности. Статическое размещение более эффективно, так как выделение памяти происходит до выполнения программы , однако оно гораздо менее гибко, потому что мы должны заранее знать тип и размер размещаемого объекта." Так тут как раз не про стековые, а про настоящие статические объекты написано :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2014, 16:51 |
|
||
|
А где создание объекта
|
|||
|---|---|---|---|
|
#18+
Вы все усложняете, нужно объяснить более просто, память выделяется либо ДО выполнения программы либо ВО время выполнения программы. Все что ДО это НЕ ДИНАМИЧЕСКОЕ а все что ВО время выполнения это ДИНАМИЧЕСКОЕ выделение. А все эти ваши разделения на статическую- автоматическую и динамическую память, только усложняют простые вещи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2014, 17:03 |
|
||
|
А где создание объекта
|
|||
|---|---|---|---|
|
#18+
SheratonА все эти ваши разделения на статическую- автоматическую и динамическую память, только усложняют простые вещи.ага, а потом эти новички берут и задают вот такой вопрос 16630227 Потому что не понимают, что такое "статический", а что такое "на стеке". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2014, 18:25 |
|
||
|
А где создание объекта
|
|||
|---|---|---|---|
|
#18+
SheratonВы все усложняете, нужно объяснить более просто, память выделяется либо ДО выполнения программы либо ВО время выполнения программы. Все что ДО это НЕ ДИНАМИЧЕСКОЕ а все что ВО время выполнения это ДИНАМИЧЕСКОЕ выделение. А все эти ваши разделения на статическую- автоматическую и динамическую память, только усложняют простые вещи. Код: plaintext 1. 2. 3. 4. Вот в этом коде память переменной a, которую вы выше назвали созданной статически, выделяется ДО или ВО время исполнения? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2014, 19:29 |
|
||
|
А где создание объекта
|
|||
|---|---|---|---|
|
#18+
Anatoly Moskovsky.......... Код: plaintext 1. 2. 3. 4. Вот в этом коде память переменной a, которую вы выше назвали созданной статически, выделяется ДО или ВО время исполнения? Память выделяется ДО времени исполнения (даже не смотря на то, что находится внутри функции) и не важно в статическом разделе памяти или автоматическом, важно ДО. А если бы было: Код: plaintext 1. то это было бы выделение ВО время исполнения и выделялась бы в куче. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2014, 20:31 |
|
||
|
А где создание объекта
|
|||
|---|---|---|---|
|
#18+
забыл int после new ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2014, 20:32 |
|
||
|
А где создание объекта
|
|||
|---|---|---|---|
|
#18+
ну и без а после int new ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2014, 20:32 |
|
||
|
А где создание объекта
|
|||
|---|---|---|---|
|
#18+
:)) в смысле int* a = new int(2); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2014, 20:33 |
|
||
|
А где создание объекта
|
|||
|---|---|---|---|
|
#18+
SheratonAnatoly Moskovsky Код: plaintext 1. 2. 3. 4. Вот в этом коде память переменной a, которую вы выше назвали созданной статически, выделяется ДО или ВО время исполнения? Память выделяется ДО времени исполнения (даже не смотря на то, что находится внутри функции) и не важно в статическом разделе памяти или автоматическом, важно ДО. Извините, но это вообще не так. Память для автоматических переменных не выделяется ДО исполнения программы. Она выделяется в момент каждого вызова функции (т.е. во время исполнения), причем сколько раз вызывают функцию, столько раз и выделяется память. А то что компилятор размер этой памяти заранее рассчитывает, так он при "new a" тоже заранее размер рассчитывает (при компиляции). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2014, 21:11 |
|
||
|
А где создание объекта
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyИзвините, но это вообще не так. Память для автоматических переменных не выделяется ДО исполнения программы. Она выделяется в момент каждого вызова функции (т.е. во время исполнения), причем сколько раз вызывают функцию, столько раз и выделяется память. А то что компилятор размер этой памяти заранее рассчитывает, так он при "new a" тоже заранее размер рассчитывает (при компиляции). Не надо извиняться. Мы живем в свободном обществе, поэтому каждый человек может думать, так как считает правильным. Я буду придерживаться, мнения указанного в книге, выдержки из которой я привел выше. Она у меня сейчас по правую руку, рядом с мышкой лежит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2014, 21:22 |
|
||
|
А где создание объекта
|
|||
|---|---|---|---|
|
#18+
SheratonМы живем в свободном обществе, поэтому каждый человек может думать, так как считает правильным Это не вопрос мнения. Память либо выделяется либо нет. Если функция не вызвана, то никакого выделения памяти для автоматической переменной не происходит, независимо от вашего мнения. И кстати цитата из этой книги, которую вы привели выше, никак не подтвержает ваше мнение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2014, 00:09 |
|
||
|
А где создание объекта
|
|||
|---|---|---|---|
|
#18+
А капец нафлудили ))) Шучу. Начнем с того что я не новичок .. Давайте не будем обсуждать простые вещи типа, локальных, глобавльных, регстровых переменных. Anatoly MoskovskyСлово "статический" в тех цитатах, что вы привели, относится к методам, а не объекту. А чтобы создать статический объект нужно явно указать static при его объявлении. Меня интересует статический объект, на методы мне фиолетово (не о них речь сейчас). Именно его я и искал в модуле QMessageBox и не нашел, там есть только статические методы. Если он там есть то приведите строку кода из этого модуля - собственно в чем и суть вопроса. Второй вопрос насчет трактования что статические объекты размещаются в стеке, Для меня это звучит странно, но так было сказано, боооольшим специлистом на QT Привожу его слова: Understanding the different ways to instantiate the QMessageBox class Andre Andre 6399 posts Certified Specialist Qt DevNet ModeratorAs you have recognized already there are different ways to use QMessageBox. The static method is for displaying a message box quickly. IMHO it is more a matter of taste and preference which you are using. However, the non-static methods you are referring are different from the location where you are placing the instance. The first method uses the stack for the complete object. The second method is using the heap. See this for a short information on heap and stack. [quora.com] Такой вот крутой из себя модератор заявляет вот такие вот вещи. Звучит бредово - потому что если есть боольшой статический объект, то на камнях с 32 битной адресацией, он может переполнить сегмент стека. Поэтому второй мой вопрос и был насчет - The first method uses the stack for the complete object. Здесь акцентируем внимание на слово complete . Так вот либо у них модераторы глупые либо он реально весь целиком в стеке сидит ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2014, 00:49 |
|
||
|
А где создание объекта
|
|||
|---|---|---|---|
|
#18+
JudoМеня интересует статический объект, на методы мне фиолетово (не о них речь сейчас). Именно его я и искал в модуле QMessageBox и не нашел, там есть только статические методы. Если он там есть то приведите строку кода из этого модуля - собственно в чем и суть вопроса. Да нет там в исходниках класса никакого статического объекта. Статический или нет - определяете вы, как пользователь класса. Я вам уже написал, что в той цитате не про объект говорили, а про методы создания - статический (через объявление переменной) и динамический (через new). Но такая терминология вводит в заблуждение, поскольку не делает разницы между данными способами создания объектов: Код: plaintext 1. 2. 3. 4. 5. m1 - действительно статический объект (как это описано в стандарте), а m2 - автоматический(стековый) - у них совершенно разное время жизни. JudoПоэтому второй мой вопрос и был насчет - The first method uses the stack for the complete object. Здесь акцентируем внимание на слово complete . Врядли полностью на стеке объект создается. Там наверняка есть вложенные объекты которые размещаются в куче. Иначе для следующей команды надо было бы заранее резервировать фиксированный массив в объекте для хранения строки, а никакого фиксированного лимита там нет, уверен. Код: plaintext 1. JudoТак вот либо у них модераторы глупые либо он реально весь целиком в стеке сидит Не стоит путать глупость с невежеством :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2014, 01:30 |
|
||
|
А где создание объекта
|
|||
|---|---|---|---|
|
#18+
Anatoly Moskovsky +1 Спасибо за разьяснения. Проблема была в том что если бы в Java написать Код: java 1. Или в Дельфи Код: pascal 1. То это не создаст объект. А просто у нас будет ссылка-имя которой потом надо присвоить объект с помощью new или (:=TThread.Create) В С++ тоже есть new. И я думал что для не элементарных типов его надо всегда использовать. Поэтому QMessageBox msgBox; выглядит странно - т.е. ссылка есть а объект не выделен. Может быть это какой то хитрый статический конструктор или фича С++ - видать надо читать ману.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2014, 02:10 |
|
||
|
А где создание объекта
|
|||
|---|---|---|---|
|
#18+
JudoВ С++ тоже есть new. И я думал что для не элементарных типов его надо всегда использовать. Нет. В С++ эти два способа абсолютно равноправны с точки зрения функциональности (если не рассматривать размещение и время жизни объекта). И никак специально не надо объявлять класс чтобы обоими способами можно было пользоваться. Иногда создатели класса запрещают (в документации либо средствами языка) создание объекта иначе чем через new (например при необходимости использовании смартуказателей). Но если явно не запретили - значит вы можете применять оба способа. Никакой особой разницы не будет. Особенно для классов реализующих GUI, поскольку все они - суть обертки над нижележащими примитивами ОС. Да и в Qt насколько я помню, все GUI классы реализованы через PImpl, т.е. содержат лишь указатель на фактическую реализацию, так что все равно все в куче выделяется :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2014, 02:27 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=38759864&tid=2019289]: |
0ms |
get settings: |
10ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
52ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
57ms |
get tp. blocked users: |
1ms |
| others: | 13ms |
| total: | 164ms |

| 0 / 0 |
