Перейти к публикации
  • Сейчас на странице   Всего пользователей: 2   (0 пользователей, 2 гостя)

Hed-kun

Программирование, т. 5.1.

Рекомендованные сообщения

Господа вопрос от человека прочитавшего страуса, майерса и других известных поэтов(и не нашедшего там объяснения).

Пусть у нас множественное наследование. (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 часов в день. И еще столько же ночью.

Поделиться сообщением


Ссылка на сообщение

 

Господа вопрос от человека прочитавшего страуса, майерса и других известных поэтов(и не нашедшего там объяснения).

Пусть у нас множественное наследование. (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 GOGOGO

MYM GOGO

TR GOGOGO

Поделиться сообщением


Ссылка на сообщение

Деструктор, тот который ~C, не удаляет память которую занимает объект. Этот код вставит сам компилятор в том месте где переменная в стеке больше не нужна, или где ты вызываешь delete

Поделиться сообщением


Ссылка на сообщение
(изменено)

Очередность вызовов можно проверить простым тестом, зачем базар разводить.

А с памятью и очередностью расположения в ней все не так просто, т.к. существуют виртуальное наследование, алигнмент, под и тривиальные типы. Можно делать предположения для некоторых компиляторов, но стандарт вроде не предполагает конкретного расположения в памяти.


Изменено пользователем Tinplz

Поделиться сообщением


Ссылка на сообщение

ебать, пацаны, вы по хуйне угораете


Публикация отключена

Поделиться сообщением


Ссылка на сообщение
(изменено)

а вообще хаскелл выглядит впечатляюще


Изменено пользователем Tinplz

Поделиться сообщением


Ссылка на сообщение

 

Очередность вызовов можно проверить простым тестом, зачем базар разводить.

А с памятью и очередностью расположения в ней все не так просто, т.к. существуют виртуальное наследование, алигнмент, под и тривиальные типы. Можно делать предположения для некоторых компиляторов, но стандарт вроде не предполагает конкретного расположения в памяти.

 

Спасибо за вход в обсуждение конечно, но про очередность вызовов мы не спорили, там как утверждение всё шло. Вопросы были о подсвеченном жирным, хотелось как раз описанное тобой подробно узнать. Но как я понял главная мысль твоего поста - то что это шлак ненужный, который никому не нужен ?(знания об этом). На собесед скоро иду, поэтому плотно готовлюсь, думаю всякую хуйню спросить могут.

 

Комрады поясните за статью пожалуйста http://www.rsdn.ru/article/cpp/ObjectsAndPointers.xml

Раздел "Динамическая память и стек", подраздел "Автоматическая память (стек)"

Цитирую:

"Непосредственное управление автоматической памятью — выделение памяти под локальные объекты при их создании и освобождение занимаемой объектами памяти при их разрушении — осуществляется компилятором."; "Обрабатывая определение локального имени, компилятор генерирует код размещения соответствующего ему объекта в регионе автоматической памяти: код выделения памяти под объект и вызова конструктора для инициализации выделенной памяти."

Вопрос: какой нафиг компилятор ? Компилятор переводит написанный нами код в машинный код, создаёт исполняемый файл. На этом его работа окончена. Каким образом при запуске и выполнении программы он "выделяет память под локальные объекта ..." и тд, описанное в цитате ?

Я думал этим занимается ядро системы. В статье ошибка или я не шарю ?


M5 GOGOGO

MYM GOGO

TR GOGOGO

Поделиться сообщением


Ссылка на сообщение

под словами компилятор выделяет - подразумевается то, что он задает поведение для выделения. + добавляет рантайм проверки, для подтверждения корректности поведения.

насчет спросить - офк спросят, они любят всякую бесполезную хуету спрашивать.

Из того немногого что тебе нужно об этом знать выделить стоит следующее: 1) если тип ПОД - то его можно через мемкопи копировать, + взглянь на свойства тривиальных классов. Вроде там по одному и тому же оффсету те же самые поля лежать должны, но это юзлессная хуета 2) Не играй руками с адресами, предполагая что и где находится - просто касти. Дай компилятору самому разобраться. 3) Для оптимизации по памяти, что бы алигнмент нормально работал, объявляй сразу большие типы, потом меньшие.

А больше в принципе ничего там интересного и нету.

Поделиться сообщением


Ссылка на сообщение

под словами компилятор выделяет - подразумевается то, что он задает поведение для выделения. + добавляет рантайм проверки, для подтверждения корректности поведения.

насчет спросить - офк спросят, они любят всякую бесполезную хуету спрашивать.

Из того немногого что тебе нужно об этом знать выделить стоит следующее: 1) если тип ПОД - то его можно через мемкопи копировать, + взглянь на свойства тривиальных классов. Вроде там по одному и тому же оффсету те же самые поля лежать должны, но это юзлессная хуета 2) Не играй руками с адресами, предполагая что и где находится - просто касти. Дай компилятору самому разобраться. 3) Для оптимизации по памяти, что бы алигнмент нормально работал, объявляй сразу большие типы, потом меньшие.

А больше в принципе ничего там интересного и нету.

Про "3)" читал, но как понял любой современный компилятор автоматом объявит вначале большие типы, потом меньшие(конечно знать об этом надо).

Про "2)" это ты про RTTI ?

А про выделенное немного поподробнее можно ? Лучшеб они в статье просто "ядро" написали, а то как-то несуразно звучит.


M5 GOGOGO

MYM GOGO

TR GOGOGO

Поделиться сообщением


Ссылка на сообщение

ну компилятор просто добавляет функцию на выделение памяти, и, если настроен, рантайм чеки на успешность и т д, если получается хуета - кидает эксепшн.

рантайм уже вернет или бросит эксепшн, или вернет адрес, или что еще там сделает.

3) хуй тебе он что сам сделает. велкам ту с++ ворлд.

2) множественное наследование, ртти. добавление виртуальной функции автоматически делает любой класс нетривиальным. (если правильно помню).

вообще ртти еще та хуета. Кланг очень жаловался на их чрезмерно раздутые таблицы функций и типов. Лучше обходится без виртуальных функций, если время, силы и реализация позволяет.

 

+ РСДН еще та хуета.

учи инглиш, читай на инглише.

Поделиться сообщением


Ссылка на сообщение

ну компилятор просто добавляет функцию на выделение памяти, и, если настроен, рантайм чеки на успешность и т д, если получается хуета - кидает эксепшн.

рантайм уже вернет или бросит эксепшн, или вернет адрес, или что еще там сделает.

3) хуй тебе он что сам сделает. велкам ту с++ ворлд.

2) множественное наследование, ртти. добавление виртуальной функции автоматически делает любой класс нетривиальным. (если правильно помню).

вообще ртти еще та хуета. Кланг очень жаловался на их чрезмерно раздутые таблицы функций и типов. Лучше обходится без виртуальных функций, если время, силы и реализация позволяет.

 

+ РСДН еще та хуета.

учи инглиш, читай на инглише.

хорошо, понял. хотелось просто краткую выжимку про выделение памяти почитать, а не книгу с 500листов, потому что уже нет времени такие объёмы читать. нужны и алгоритмы и структуры, всё надо повторять/изучать, а времени мало.

На инглише сейчас страуструпа 2013 про c++11 читаю.

спасибо за ответы.


M5 GOGOGO

MYM GOGO

TR GOGOGO

Поделиться сообщением


Ссылка на сообщение

А хули ты хотел с++ изучая. Нет машины времени - нехуй лезть.

Это да. Ебанутая хрень. Даже я забил на разборы всей этой хрени, т.к. попросту времени жалко.

Поделиться сообщением


Ссылка на сообщение
(изменено)

Ну бля, я решил С++ подучить и пойти на стажировку, а когда хоть немного углубился понял, что пиздец посравнению с шарпами/джавой и прочим. но теперь уже жаль проёбанного времени, отступать не вариант.

да и думаю сейчас спрос намного больше предложения на с++ прогеров ибо все на ООП языки и веб подсели

плюс думаю после ++ перейти на другой язык легче чем в обратку.


Изменено пользователем On2ran

M5 GOGOGO

MYM GOGO

TR GOGOGO

Поделиться сообщением


Ссылка на сообщение
(изменено)

как обычно, решил через 5 минут после вопроса. блеать


Изменено пользователем DracoLich

если бы ты постил свои посты на спец форумах по исследованию дегенератов, где за каждый дегенеративный пост платят 1 цент, ты бы уже был в десятке форбс

Поделиться сообщением


Ссылка на сообщение

Ну бля, я решил С++ подучить и пойти на стажировку, а когда хоть немного углубился понял, что пиздец посравнению с шарпами/джавой и прочим. но теперь уже жаль проёбанного времени, отступать не вариант.

да и думаю сейчас спрос намного больше предложения на с++ прогеров ибо все на ООП языки и веб подсели

плюс думаю после ++ перейти на другой язык легче чем в обратку.

лучше забей на плюсы. они реально для хардкорщиков. я уже в них хуй знает сколько времени убил, перечитал все что можно, и кода написано дохуя. Если хочешь писать для души что-либо, монотонно, долго, вылавливая все баги, что должно работать быстро - то может быть они и подошли бы. Но если смотерть с позиции - просто взять и быстро наклепать какую-нибудь идею и продать - то тут они отсасывают по-страшному. Потому что приходится думать о куче разных вещей кроме логики. Может планирование и разработка доскональных требований и архитектуры спасает, но иногда хочется просто взять, сесть, и писать код. А не получается.

Поделиться сообщением


Ссылка на сообщение

как обычно, решил через 5 минут после вопроса. блеать

рад был помочь :nate:

 

Ну бля, я решил С++ подучить и пойти на стажировку, а когда хоть немного углубился понял, что пиздец посравнению с шарпами/джавой и прочим. но теперь уже жаль проёбанного времени, отступать не вариант.

да и думаю сейчас спрос намного больше предложения на с++ прогеров ибо все на ООП языки и веб подсели

плюс думаю после ++ перейти на другой язык легче чем в обратку.

лучше забей на плюсы. они реально для хардкорщиков. я уже в них хуй знает сколько времени убил, перечитал все что можно, и кода написано дохуя. Если хочешь писать для души что-либо, монотонно, долго, вылавливая все баги, что должно работать быстро - то может быть они и подошли бы. Но если смотерть с позиции - просто взять и быстро наклепать какую-нибудь идею и продать - то тут они отсасывают по-страшному. Потому что приходится думать о куче разных вещей кроме логики. Может планирование и разработка доскональных требований и архитектуры спасает, но иногда хочется просто взять, сесть, и писать код. А не получается.

поэтому плюсы и не используют для идей, которые надо быстро наклепать

 

всё как всегда, если тебе надо уметь прострелить себе ногу, и сделать это так быстро и с аккуратненькой дырочкой, то плюсы.

 

жаль только по ноге стреляет еще и тогда, когда тебе не надо :sad:


Торжество разума в том, чтобы уживаться с теми, у кого этого разума нет. Вольтер.
Чтобы хорошо высыпаться, нужно спать 8 часов в день. И еще столько же ночью.

Поделиться сообщением


Ссылка на сообщение

А какой язык программирования один из самых простых? и эффектных :buba:

Поделиться сообщением


Ссылка на сообщение
Гость
Эта тема закрыта для публикации сообщений.

×
×
  • Создать...