Kant #3621 17 марта 2014 Господа вопрос от человека прочитавшего страуса, майерса и других известных поэтов(и не нашедшего там объяснения).Пусть у нас множественное наследование. (c++ под катом)class A { };class B: public A {};class C: public B{}; int main () {C obj;} Ясно, что при конструировании объекта obj, вначале вызовется конструкторов базового класса А, затем Б, и лишь затем С.Вопрос: как это происходит в памяти ? У нас выделяется кусок памяти для объекта типа А, вызывается его конструктор. Затем добавляется к этому памяти кусок памяти с данными(методами и переменными) объекта типа Б, вызывается его конструктор.Затем к этому куску памяти добавляется кусок для объекта С, и всё полученное именуется "obj" ? Это звучит очень глупо, у нас в промежутки между выделением и вызовом конструктора будет ещё память под что-то отводится, в итоге объект будет лежать в памяти непоследовательно. Или за один раз выделяется память равная sizeof(A)+sizeof(B)+sizeof© ? Опять же если она выделяется сразу одним блоком, то освобождается то она кусочно (при вызове деструкторов). Значит мы должны знать какую область памяти занимают данные под каждый из классов. компилятор же знает, у какого типа ты вызваешь new, от для этого типа память и выделяет. А память класса С равна размеру полей самого С и размеру полей всех его предков.И потом уже вызвает конструкторы. Конструктор А вообще не знает, что за его пределами что-то есть, но это ему не мешает. Каждый конструктор будет писать в область памяти, которую он считает своей. И лишь С будет знать, сколько памяти на самом деле выделено ну и это не называется множественным наследованием. Множественное наследование это class C: public A, public B {} Торжество разума в том, чтобы уживаться с теми, у кого этого разума нет. Вольтер.Чтобы хорошо высыпаться, нужно спать 8 часов в день. И еще столько же ночью. Поделиться сообщением Ссылка на сообщение
On2ran #3622 17 марта 2014 Господа вопрос от человека прочитавшего страуса, майерса и других известных поэтов(и не нашедшего там объяснения).Пусть у нас множественное наследование. (c++ под катом)class A { };class B: public A {};class C: public B{}; int main () {C obj;} Ясно, что при конструировании объекта obj, вначале вызовется конструкторов базового класса А, затем Б, и лишь затем С.Вопрос: как это происходит в памяти ? У нас выделяется кусок памяти для объекта типа А, вызывается его конструктор. Затем добавляется к этому памяти кусок памяти с данными(методами и переменными) объекта типа Б, вызывается его конструктор.Затем к этому куску памяти добавляется кусок для объекта С, и всё полученное именуется "obj" ? Это звучит очень глупо, у нас в промежутки между выделением и вызовом конструктора будет ещё память под что-то отводится, в итоге объект будет лежать в памяти непоследовательно. Или за один раз выделяется память равная sizeof(A)+sizeof(B)+sizeof© ? Опять же если она выделяется сразу одним блоком, то освобождается то она кусочно (при вызове деструкторов). Значит мы должны знать какую область памяти занимают данные под каждый из классов. компилятор же знает, у какого типа ты вызваешь new, от для этого типа память и выделяет. А память класса С равна размеру полей самого С и размеру полей всех его предков.И потом уже вызвает конструкторы. Конструктор А вообще не знает, что за его пределами что-то есть, но это ему не мешает. Каждый конструктор будет писать в область памяти, которую он считает своей. И лишь С будет знать, сколько памяти на самом деле выделено ну и это не называется множественным наследованием. Множественное наследование это class C: public A, public B {} 1. я на самом деле так и хотел написать class C: public A, public B {}, но потом подумал, что такой вопрос будет еще запутаннее звучать, а смысл хотел узнать тотже. Про new понял, но что, если мы не используем new?(т.е. не указатель на объект. а просто C obj;)Получается в стеке размещаем объект. Тогда в стеке будет также выделена память размера типа ?2. При удалении объектов, будут вызваны деструкторы. Первым будет вызван деструктор производного класса. Получается он освободит область, отвечающую только за данные в произвольном классе ? Аналогично конструкторам получается. M5 GOGOGOMYM GOGOTR GOGOGO Поделиться сообщением Ссылка на сообщение
DeadMage #3623 17 марта 2014 Деструктор, тот который ~C, не удаляет память которую занимает объект. Этот код вставит сам компилятор в том месте где переменная в стеке больше не нужна, или где ты вызываешь delete Поделиться сообщением Ссылка на сообщение
Tinplz #3624 18 марта 2014 (изменено) Очередность вызовов можно проверить простым тестом, зачем базар разводить.А с памятью и очередностью расположения в ней все не так просто, т.к. существуют виртуальное наследование, алигнмент, под и тривиальные типы. Можно делать предположения для некоторых компиляторов, но стандарт вроде не предполагает конкретного расположения в памяти. Изменено 18 марта 2014 пользователем Tinplz Поделиться сообщением Ссылка на сообщение
KotZhilkina #3625 18 марта 2014 ебать, пацаны, вы по хуйне угораете Публикация отключена Поделиться сообщением Ссылка на сообщение
Двапой #3627 18 марта 2014 было на предыдущей странице Мобильное приложение для продоты https://play.google....id=ru.prodota.m Поделиться сообщением Ссылка на сообщение
Tinplz #3628 18 марта 2014 (изменено) а вообще хаскелл выглядит впечатляюще Изменено 18 марта 2014 пользователем Tinplz Поделиться сообщением Ссылка на сообщение
On2ran #3629 20 марта 2014 Очередность вызовов можно проверить простым тестом, зачем базар разводить.А с памятью и очередностью расположения в ней все не так просто, т.к. существуют виртуальное наследование, алигнмент, под и тривиальные типы. Можно делать предположения для некоторых компиляторов, но стандарт вроде не предполагает конкретного расположения в памяти. Спасибо за вход в обсуждение конечно, но про очередность вызовов мы не спорили, там как утверждение всё шло. Вопросы были о подсвеченном жирным, хотелось как раз описанное тобой подробно узнать. Но как я понял главная мысль твоего поста - то что это шлак ненужный, который никому не нужен ?(знания об этом). На собесед скоро иду, поэтому плотно готовлюсь, думаю всякую хуйню спросить могут. Комрады поясните за статью пожалуйста http://www.rsdn.ru/article/cpp/ObjectsAndPointers.xmlРаздел "Динамическая память и стек", подраздел "Автоматическая память (стек)"Цитирую: "Непосредственное управление автоматической памятью — выделение памяти под локальные объекты при их создании и освобождение занимаемой объектами памяти при их разрушении — осуществляется компилятором."; "Обрабатывая определение локального имени, компилятор генерирует код размещения соответствующего ему объекта в регионе автоматической памяти: код выделения памяти под объект и вызова конструктора для инициализации выделенной памяти."Вопрос: какой нафиг компилятор ? Компилятор переводит написанный нами код в машинный код, создаёт исполняемый файл. На этом его работа окончена. Каким образом при запуске и выполнении программы он "выделяет память под локальные объекта ..." и тд, описанное в цитате ? Я думал этим занимается ядро системы. В статье ошибка или я не шарю ? M5 GOGOGOMYM GOGOTR GOGOGO Поделиться сообщением Ссылка на сообщение
Tinplz #3630 20 марта 2014 под словами компилятор выделяет - подразумевается то, что он задает поведение для выделения. + добавляет рантайм проверки, для подтверждения корректности поведения.насчет спросить - офк спросят, они любят всякую бесполезную хуету спрашивать.Из того немногого что тебе нужно об этом знать выделить стоит следующее: 1) если тип ПОД - то его можно через мемкопи копировать, + взглянь на свойства тривиальных классов. Вроде там по одному и тому же оффсету те же самые поля лежать должны, но это юзлессная хуета 2) Не играй руками с адресами, предполагая что и где находится - просто касти. Дай компилятору самому разобраться. 3) Для оптимизации по памяти, что бы алигнмент нормально работал, объявляй сразу большие типы, потом меньшие.А больше в принципе ничего там интересного и нету. Поделиться сообщением Ссылка на сообщение
On2ran #3631 20 марта 2014 под словами компилятор выделяет - подразумевается то, что он задает поведение для выделения. + добавляет рантайм проверки, для подтверждения корректности поведения.насчет спросить - офк спросят, они любят всякую бесполезную хуету спрашивать.Из того немногого что тебе нужно об этом знать выделить стоит следующее: 1) если тип ПОД - то его можно через мемкопи копировать, + взглянь на свойства тривиальных классов. Вроде там по одному и тому же оффсету те же самые поля лежать должны, но это юзлессная хуета 2) Не играй руками с адресами, предполагая что и где находится - просто касти. Дай компилятору самому разобраться. 3) Для оптимизации по памяти, что бы алигнмент нормально работал, объявляй сразу большие типы, потом меньшие.А больше в принципе ничего там интересного и нету.Про "3)" читал, но как понял любой современный компилятор автоматом объявит вначале большие типы, потом меньшие(конечно знать об этом надо).Про "2)" это ты про RTTI ?А про выделенное немного поподробнее можно ? Лучшеб они в статье просто "ядро" написали, а то как-то несуразно звучит. M5 GOGOGOMYM GOGOTR GOGOGO Поделиться сообщением Ссылка на сообщение
Tinplz #3632 20 марта 2014 ну компилятор просто добавляет функцию на выделение памяти, и, если настроен, рантайм чеки на успешность и т д, если получается хуета - кидает эксепшн.рантайм уже вернет или бросит эксепшн, или вернет адрес, или что еще там сделает.3) хуй тебе он что сам сделает. велкам ту с++ ворлд.2) множественное наследование, ртти. добавление виртуальной функции автоматически делает любой класс нетривиальным. (если правильно помню).вообще ртти еще та хуета. Кланг очень жаловался на их чрезмерно раздутые таблицы функций и типов. Лучше обходится без виртуальных функций, если время, силы и реализация позволяет. + РСДН еще та хуета. учи инглиш, читай на инглише. Поделиться сообщением Ссылка на сообщение
On2ran #3633 20 марта 2014 ну компилятор просто добавляет функцию на выделение памяти, и, если настроен, рантайм чеки на успешность и т д, если получается хуета - кидает эксепшн.рантайм уже вернет или бросит эксепшн, или вернет адрес, или что еще там сделает.3) хуй тебе он что сам сделает. велкам ту с++ ворлд.2) множественное наследование, ртти. добавление виртуальной функции автоматически делает любой класс нетривиальным. (если правильно помню).вообще ртти еще та хуета. Кланг очень жаловался на их чрезмерно раздутые таблицы функций и типов. Лучше обходится без виртуальных функций, если время, силы и реализация позволяет. + РСДН еще та хуета.учи инглиш, читай на инглише.хорошо, понял. хотелось просто краткую выжимку про выделение памяти почитать, а не книгу с 500листов, потому что уже нет времени такие объёмы читать. нужны и алгоритмы и структуры, всё надо повторять/изучать, а времени мало.На инглише сейчас страуструпа 2013 про c++11 читаю.спасибо за ответы. M5 GOGOGOMYM GOGOTR GOGOGO Поделиться сообщением Ссылка на сообщение
Двапой #3634 20 марта 2014 А хули ты хотел с++ изучая. Нет машины времени - нехуй лезть. Мобильное приложение для продоты https://play.google....id=ru.prodota.m Поделиться сообщением Ссылка на сообщение
Tinplz #3635 20 марта 2014 А хули ты хотел с++ изучая. Нет машины времени - нехуй лезть.Это да. Ебанутая хрень. Даже я забил на разборы всей этой хрени, т.к. попросту времени жалко. Поделиться сообщением Ссылка на сообщение
On2ran #3636 20 марта 2014 (изменено) Ну бля, я решил С++ подучить и пойти на стажировку, а когда хоть немного углубился понял, что пиздец посравнению с шарпами/джавой и прочим. но теперь уже жаль проёбанного времени, отступать не вариант.да и думаю сейчас спрос намного больше предложения на с++ прогеров ибо все на ООП языки и веб подселиплюс думаю после ++ перейти на другой язык легче чем в обратку. Изменено 20 марта 2014 пользователем On2ran M5 GOGOGOMYM GOGOTR GOGOGO Поделиться сообщением Ссылка на сообщение
DracoLich #3637 20 марта 2014 (изменено) как обычно, решил через 5 минут после вопроса. блеать Изменено 20 марта 2014 пользователем DracoLich если бы ты постил свои посты на спец форумах по исследованию дегенератов, где за каждый дегенеративный пост платят 1 цент, ты бы уже был в десятке форбс Поделиться сообщением Ссылка на сообщение
Tinplz #3638 20 марта 2014 Ну бля, я решил С++ подучить и пойти на стажировку, а когда хоть немного углубился понял, что пиздец посравнению с шарпами/джавой и прочим. но теперь уже жаль проёбанного времени, отступать не вариант.да и думаю сейчас спрос намного больше предложения на с++ прогеров ибо все на ООП языки и веб подселиплюс думаю после ++ перейти на другой язык легче чем в обратку.лучше забей на плюсы. они реально для хардкорщиков. я уже в них хуй знает сколько времени убил, перечитал все что можно, и кода написано дохуя. Если хочешь писать для души что-либо, монотонно, долго, вылавливая все баги, что должно работать быстро - то может быть они и подошли бы. Но если смотерть с позиции - просто взять и быстро наклепать какую-нибудь идею и продать - то тут они отсасывают по-страшному. Потому что приходится думать о куче разных вещей кроме логики. Может планирование и разработка доскональных требований и архитектуры спасает, но иногда хочется просто взять, сесть, и писать код. А не получается. Поделиться сообщением Ссылка на сообщение
Kant #3639 20 марта 2014 как обычно, решил через 5 минут после вопроса. блеатьрад был помочь Ну бля, я решил С++ подучить и пойти на стажировку, а когда хоть немного углубился понял, что пиздец посравнению с шарпами/джавой и прочим. но теперь уже жаль проёбанного времени, отступать не вариант.да и думаю сейчас спрос намного больше предложения на с++ прогеров ибо все на ООП языки и веб подселиплюс думаю после ++ перейти на другой язык легче чем в обратку.лучше забей на плюсы. они реально для хардкорщиков. я уже в них хуй знает сколько времени убил, перечитал все что можно, и кода написано дохуя. Если хочешь писать для души что-либо, монотонно, долго, вылавливая все баги, что должно работать быстро - то может быть они и подошли бы. Но если смотерть с позиции - просто взять и быстро наклепать какую-нибудь идею и продать - то тут они отсасывают по-страшному. Потому что приходится думать о куче разных вещей кроме логики. Может планирование и разработка доскональных требований и архитектуры спасает, но иногда хочется просто взять, сесть, и писать код. А не получается.поэтому плюсы и не используют для идей, которые надо быстро наклепать всё как всегда, если тебе надо уметь прострелить себе ногу, и сделать это так быстро и с аккуратненькой дырочкой, то плюсы. жаль только по ноге стреляет еще и тогда, когда тебе не надо Торжество разума в том, чтобы уживаться с теми, у кого этого разума нет. Вольтер.Чтобы хорошо высыпаться, нужно спать 8 часов в день. И еще столько же ночью. Поделиться сообщением Ссылка на сообщение
janitor93 #3640 20 марта 2014 А какой язык программирования один из самых простых? и эффектных Поделиться сообщением Ссылка на сообщение