Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Несколько вопросов начинающего программиста.
|
|||
|---|---|---|---|
|
#18+
1. Верно ли утверждение, что указатели на объекты любого типа занимают одинаковый объём в памяти? 2. У встроенных типов деструкторов не существует? 3. Верно ли, что при вызове небооработанного исключения в деструкторе вызываются деструкторы для всех частей объекта, а сам объект после этого корректно уничтожается при условии, что уничтожились все части объекта, хранящиеся в куче (указатели)? 4. Означают ли одно и то же понятия "размер объекта" и "размер класса"? 5. Насколько я правильно понял из чтения умных книг, для всех дочерних объектов одного класса существует лишь одна таблица виртуальных функций. Почему тогда она влияет на размер объекта, ведь статические члены и невиртуальные ф-и не влияют? Почему вообще число виртуальных ф-й влияет на размер объекта, ведь число обычных не влияет? 6. Чем отличается abort() от terminate() и какой в них смысл, кроме убийства программы? 7. Параллельно с плюсами хочу осваивать одну из ОС: Unix или Linux (много вакансий требуют уметь писать код не только под Windows). Сориентируйте, за какую лучше браться и по какой книге. 8. Есть ли хорошие книги по метапрограммированию с помощью шаблонов? Интересует что-то большее, чем вычисление факториала при компиляции. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.11.2012, 08:28 |
|
||
|
Несколько вопросов начинающего программиста.
|
|||
|---|---|---|---|
|
#18+
ayvango1. Верно ли утверждение, что указатели на объекты любого типа занимают одинаковый объём в памяти? 2. У встроенных типов деструкторов не существует? 3. Верно ли, что при вызове небооработанного исключения в деструкторе вызываются деструкторы для всех частей объекта, а сам объект после этого корректно уничтожается при условии, что уничтожились все части объекта, хранящиеся в куче (указатели)? 4. Означают ли одно и то же понятия "размер объекта" и "размер класса"? 5. Насколько я правильно понял из чтения умных книг, для всех дочерних объектов одного класса существует лишь одна таблица виртуальных функций. Почему тогда она влияет на размер объекта, ведь статические члены и невиртуальные ф-и не влияют? Почему вообще число виртуальных ф-й влияет на размер объекта, ведь число обычных не влияет? 6. Чем отличается abort() от terminate() и какой в них смысл, кроме убийства программы? 7. Параллельно с плюсами хочу осваивать одну из ОС: Unix или Linux (много вакансий требуют уметь писать код не только под Windows). Сориентируйте, за какую лучше браться и по какой книге. 8. Есть ли хорошие книги по метапрограммированию с помощью шаблонов? Интересует что-то большее, чем вычисление факториала при компиляции. 1 - да 2 - да 3 - да, но только если деструктор вызван не в результате срабатывания исключения. В противном случае программа завершится через terminate() 4 - да 5 - нет, у каждого класса своя копия таблицы в.функций для каждого предка. В экземпляре класса хранятся указатели на таблицы конкретного класса. Именно эти указатели влияют на размер. 6 - в С вызывайте abort(), в C++ - terminate(). (А вообще в прикладной программе, не библиотеке, я не вижу реальной нужды явно вызывать эти функции) 7 - Linux конечно. Где вы Unix дома будете держать ? Не говоря уже о том чтобы найти что-то работающее из коробки :) Возьмите последнюю Ubuntu или Fedora и поставьте QtCreator из их репозитория. Для обучения - достаточно. 8 - не знаю ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.11.2012, 08:48 |
|
||
|
Несколько вопросов начинающего программиста.
|
|||
|---|---|---|---|
|
#18+
Спасибо за ответы. 3. Вы имеете ввиду, что terminate() вызовется, когда в деструкторе объекта вызвалось необработанное исключение, затем начались вызывать деструкторы полей, а потом в деструкторе одного из полей также вызвалось необработанное исключение? 5. Каждый объект имеет свою копию таблицы виртуальных функций (своих виртуальных функций и функций предков)? P.S. Это в том предположении, что виртульные функции в принципе существуют для данного объекта. 7. Поставлю, а что делать дальше? Ведь я всё равно не знаю принципиальных отличий кода для Windows от кода для Linux, где какие тонкости надо учесть и т.д.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.11.2012, 09:06 |
|
||
|
Несколько вопросов начинающего программиста.
|
|||
|---|---|---|---|
|
#18+
ayvangoСпасибо за ответы. 3. Вы имеете ввиду, что terminate() вызовется, когда в деструкторе объекта вызвалось необработанное исключение, затем начались вызывать деструкторы полей, а потом в деструкторе одного из полей также вызвалось необработанное исключение? 5. Каждый объект имеет свою копию таблицы виртуальных функций (своих виртуальных функций и функций предков)? P.S. Это в том предположении, что виртульные функции в принципе существуют для данного объекта. 7. Поставлю, а что делать дальше? Ведь я всё равно не знаю принципиальных отличий кода для Windows от кода для Linux, где какие тонкости надо учесть и т.д.. 3 - да 5 - не "Каждый объект имеет свою копию таблицы", а каждый класс, и не одну таблицу а несколько - для каждого предка. А объект (экземпляр) только ссылается на эти таблицы, которые одни и те же для всех экземпляров конкретного класса. Хотя это конечно детали реализации не описанные в стандарте, и какой-нибудь извращенный компилятор может хранить эти таблицы в самих объектах, но на практике такого нет. 7 - Это не ко мне, я ничем не могу помочь в плане советов по обучению. Могу только на конкретные вопросы ответить если буду знать ответ. Вопрос "что делать дальше?" - не конкретный :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.11.2012, 09:21 |
|
||
|
Несколько вопросов начинающего программиста.
|
|||
|---|---|---|---|
|
#18+
5. Допустим, есть классы class A{ ... } // Здесь есть виртуальный функции class B : public A{ ... } // Здесь есть виртуальный функции class C : public B{ ... } // Здесь есть виртуальный функции int main(){ C c1; C c2; return 0; } У с1 и с2 один и тот же указатель на таблицу виртуальных функций и одна и та же таблица виртуальных функций? Если да, то почему эти указатели и таблицы не организовать подобно тому, как организованы поля static? 7. Хорошо, задам конкретный вопрос: книгу вроде "Отличия С++ под Linux от С++ под Windows" может посоветовать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.11.2012, 09:36 |
|
||
|
Несколько вопросов начинающего программиста.
|
|||
|---|---|---|---|
|
#18+
ayvango5. Допустим, есть классы class A{ ... } // Здесь есть виртуальный функции class B : public A{ ... } // Здесь есть виртуальный функции class C : public B{ ... } // Здесь есть виртуальный функции int main(){ C c1; C c2; return 0; } У с1 и с2 один и тот же указатель на таблицу виртуальных функций и одна и та же таблица виртуальных функций? Если да, то почему эти указатели и таблицы не организовать подобно тому, как организованы поля static? 7. Хорошо, задам конкретный вопрос: книгу вроде "Отличия С++ под Linux от С++ под Windows" может посоветовать? 5 - потому что задача виртуальных функций - обеспечивать полиморфизм, т.е. чтобы их можно было вызвать не зная конкретного типа на этапе компиляции, а имея только объект и зная что он - экземпляр одного из наследников заданного базового класса. Поэтому при вызове виртуальной функции генерируется код, в котором по указателю на таблицу находящемуся в объекте определяется для какого конкретно класса будет вызвана функция. А сама функция индексируется по индексу в этой таблице, который одинаков для одной и той-же функции во всей иерархии наследования. Если указатель на таблицу функций хранить в статическом поле (т.е. отдельно от объекта), то по экземпляру нельзя будет отличить, это предок или наследник, и соответственно весь механизм полиморфизма не будет работать. 7 - про книги ничего не знаю, последний раз читал книгу по программированию 15 лет назад. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.11.2012, 10:19 |
|
||
|
Несколько вопросов начинающего программиста.
|
|||
|---|---|---|---|
|
#18+
ayvango1. Верно ли утверждение, что указатели на объекты любого типа занимают одинаковый объём в памяти? 2. У встроенных типов деструкторов не существует? 3. Верно ли, что при вызове небооработанного исключения в деструкторе вызываются деструкторы для всех частей объекта, а сам объект после этого корректно уничтожается при условии, что уничтожились все части объекта, хранящиеся в куче (указатели)? 4. Означают ли одно и то же понятия "размер объекта" и "размер класса"? 5. Насколько я правильно понял из чтения умных книг, для всех дочерних объектов одного класса существует лишь одна таблица виртуальных функций. Почему тогда она влияет на размер объекта, ведь статические члены и невиртуальные ф-и не влияют? Почему вообще число виртуальных ф-й влияет на размер объекта, ведь число обычных не влияет? 6. Чем отличается abort() от terminate() и какой в них смысл, кроме убийства программы? 7. Параллельно с плюсами хочу осваивать одну из ОС: Unix или Linux (много вакансий требуют уметь писать код не только под Windows). Сориентируйте, за какую лучше браться и по какой книге. 8. Есть ли хорошие книги по метапрограммированию с помощью шаблонов? Интересует что-то большее, чем вычисление факториала при компиляции. 8)Boost mpl,Александреску Локи, начни с тайплистов,потом в бусте mpl,fuson,preprocessor, книги C++ Template Metaprogramming: Concepts, Tools, and Techniques from Boost and Beyond By David Abrahams, Aleksey Gurtovoy,Андрей Александреску (Вильямс) - Современное проектирование на Cpp но в эти книги лучше на твоем уровне не лезть "сломаешь ногу". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.11.2012, 11:42 |
|
||
|
Несколько вопросов начинающего программиста.
|
|||
|---|---|---|---|
|
#18+
Anatoly Moskovsky, >>7 - Linux конечно. Где вы Unix дома будете держать ? >> Не говоря уже о том чтобы найти что-то работающее из коробки :) Не понял.. Почему нельзя Unix держать дома? Например, Debian на виртуальной машине.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.11.2012, 12:12 |
|
||
|
Несколько вопросов начинающего программиста.
|
|||
|---|---|---|---|
|
#18+
1. Верно ли утверждение, что указатели на объекты любого типа занимают одинаковый объём в памяти? В рамках одной платформы - да, это так. Но стандрат не определяет кроссплатформенный размер для указателя. Также это утверждение никак не относится к указателям на члены класса -- это совсем другая история. 2. У встроенных типов деструкторов не существует? Деструкторов не существует, но их можно вызывать. Компилятор ведёт себя так, как если бы они существовали. 3. Верно ли, что при вызове небооработанного исключения в деструкторе вызываются деструкторы для всех частей объекта, а сам объект после этого корректно уничтожается при условии, что уничтожились все части объекта, хранящиеся в куче (указатели)? Во-первых, в деструкторе не может выбрасываться необработанное исключение, если ты об этом. Если нет -- то объект корректно уничтожается в любом случае, без условий, и безотносительно того, где хранятся части объекта. 4. Означают ли одно и то же понятия "размер объекта" и "размер класса"? Ну как бы да. Размера класса не существует как такового, поэтому термин "размер класса" можно спокойно употреблять вместо "размер объекта". Хотя "размер класса" в С++ -- штука бессмысленная. 5. Насколько я правильно понял из чтения умных книг, для всех дочерних КЛАССОВ одного класса существует лишь одна таблица виртуальных функций. Как бы да. Как бы -- потому что это так только при линейном наследовании. Почему тогда она влияет на размер объекта, ведь статические члены и невиртуальные ф-и не влияют? Потому что в объекте должен лежать указатель на эту таблицу. Почему вообще число виртуальных ф-й влияет на размер объекта, ведь число обычных не влияет? Число виртуальных функций не влияет на размер объекта. Влияет само наличие виртуальных функций (класс при этом называется полиморфным). 6. Чем отличается abort() от terminate() и какой в них смысл, кроме убийства программы? Мало чем. Если интересно -- прочитай подробную спецификацию в стандарте. Если ещё интереснее -- в каждом из используемых компиляторов. 7. Параллельно с плюсами хочу осваивать одну из ОС: Unix или Linux (много вакансий требуют уметь писать код не только под Windows). Сориентируйте, за какую лучше браться и по какой книге. Linux, естественно. Ну и POSIX. Книг хороших много. Единственное -- не учи сразу всякие хрени типа QT, GTK -- запутаешься. Оно всё хорошо, но нужно гораздо реже и не составляет основу того, что нужно знать. 8. Есть ли хорошие книги по метапрограммированию с помощью шаблонов? Интересует что-то большее, чем вычисление факториала при компиляции. Йозутис и вандервуд, шаблоны в С++ (или что-то в этом роде). _*ПОСЛЕ*_ неё можно прочитать Александреску, но очень сильно увлекаться им не стоит. Возможно, есть что-то ещё, вместо Александреску. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.11.2012, 12:14 |
|
||
|
Несколько вопросов начинающего программиста.
|
|||
|---|---|---|---|
|
#18+
Спасибо за ответы. 3. Вы имеете ввиду, что terminate() вызовется, когда в деструкторе объекта вызвалось необработанное исключение, затем начались вызывать деструкторы полей, а потом в деструкторе одного из полей также вызвалось необработанное исключение? Блин, зачем так много слов ? Вызов деструктора --> выкидывается исключение из деструктора --> abort(). 5. Каждый объект имеет свою копию таблицы виртуальных функций (своих виртуальных функций и функций предков)? Нет, таблица одна на класс. Каждый объект хранит ссылку на таблицу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.11.2012, 12:17 |
|
||
|
Несколько вопросов начинающего программиста.
|
|||
|---|---|---|---|
|
#18+
GwaAnatoly Moskovsky, >>7 - Linux конечно. Где вы Unix дома будете держать ? >> Не говоря уже о том чтобы найти что-то работающее из коробки :) Не понял.. Почему нельзя Unix держать дома? Например, Debian на виртуальной машине.. Конечно надо держать линукс дома (только не Unix, а Linux, это разные вещи, не говоря уже о том, что Unix сейчас ещё и хрен найдёш). Но лучше на виртуальной машине держать Винду. Из-под линукса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.11.2012, 12:23 |
|
||
|
Несколько вопросов начинающего программиста.
|
|||
|---|---|---|---|
|
#18+
MasterZivавтор3. Вы имеете ввиду, что terminate() вызовется, когда в деструкторе объекта вызвалось необработанное исключение, затем начались вызывать деструкторы полей, а потом в деструкторе одного из полей также вызвалось необработанное исключение? Блин, зачем так много слов ? Вызов деструктора --> выкидывается исключение из деструктора --> abort().. Это не так. В деструкторе вполне можно вызывать исключения, в т.ч. и выходящие за пределы деструктора. Аварийное завершение будет только если уже идет раскрутка стека в результате другого исключения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.11.2012, 13:11 |
|
||
|
Несколько вопросов начинающего программиста.
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyВ деструкторе вполне можно вызывать исключения, в т.ч. и выходящие за пределы деструктора. Аварийное завершение будет только если уже идет раскрутка стека в результате другого исключения.единственный минус, что невозможно определить, в связи с чем вызван деструктор, из-за раскрутки стека или по вполне мирным причинам. Поэтому, стоит считать, что из деструктора выпускать исключения нельзя, на уровне инстинкта, особенно начинающему программисту. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.11.2012, 13:31 |
|
||
|
Несколько вопросов начинающего программиста.
|
|||
|---|---|---|---|
|
#18+
1. нет, не верно. Даже в пределах одной платформы и одного компилятора Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. вывод: 8 и 4, а вроде, бывает в некоторых случаях и больше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.11.2012, 14:07 |
|
||
|
Несколько вопросов начинающего программиста.
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyMasterZivпропущено... Блин, зачем так много слов ? Вызов деструктора --> выкидывается исключение из деструктора --> abort().. Это не так. В деструкторе вполне можно вызывать исключения, в т.ч. и выходящие за пределы деструктора. Аварийное завершение будет только если уже идет раскрутка стека в результате другого исключения. Абсолютно правильно. Только когда будет вызываться деструктор -- ты не контролируешь. Поэтому единственно возможное правило -- не допускать исключения наружу всегда. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.11.2012, 16:44 |
|
||
|
Несколько вопросов начинающего программиста.
|
|||
|---|---|---|---|
|
#18+
chabapok1. нет, не верно. Даже в пределах одной платформы и одного компилятора Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. вывод: 8 и 4, а вроде, бывает в некоторых случаях и больше. Какой компилятор? P.S. Значение синуса в военное время ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.11.2012, 23:56 |
|
||
|
Несколько вопросов начинающего программиста.
|
|||
|---|---|---|---|
|
#18+
MasterZivТолько когда будет вызываться деструктор -- ты не контролируешь. Поэтому единственно возможное правило -- не допускать исключения наружу всегда. Все зависит от задачи, от того прикладной это код или системный. Например есть такой паттерн обработки ошибок, когда вместо исключений возвращаются коды возврата в виде оберток над числом, которые в деструкторе проверяют читал ли их кто-то, и если не читал, то только тогда выкидывают исключение. И тут по задаче требуется выброс за пределы деструктора. Так что громкое слово "всегда" тут не уместно. Хотя обычно - да, надо ловить исключения до их выхода из деструктора. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2012, 05:25 |
|
||
|
Несколько вопросов начинающего программиста.
|
|||
|---|---|---|---|
|
#18+
chabapok1. нет, не верно. Даже в пределах одной платформы и одного компилятора Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. вывод: 8 и 4, а вроде, бывает в некоторых случаях и больше. Там речь шла про указатели на объекты, а не любые указатели. Указатели на объекты - всегда размера size_t ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2012, 05:27 |
|
||
|
Несколько вопросов начинающего программиста.
|
|||
|---|---|---|---|
|
#18+
Спасибо за ответы. 1. А почему укзатели на функцию-поле класса занимают больше места? 7. Интересуют более конкретные книги/советы. 9. (новое) Разобрался, для чего нужно открытое и закрытое наследовоания и когда каждое из них лучше применять. А для чего нужно protected-наследование? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2012, 14:45 |
|
||
|
Несколько вопросов начинающего программиста.
|
|||
|---|---|---|---|
|
#18+
ayvango1. А почему укзатели на функцию-поле класса занимают больше места? Потому что это два указателя в одной переменной - один на экземпляр класса, второй - собственно на метод. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2012, 14:48 |
|
||
|
Несколько вопросов начинающего программиста.
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakovayvango1. А почему укзатели на функцию-поле класса занимают больше места? Потому что это два указателя в одной переменной - один на экземпляр класса, второй - собственно на метод. В указателе на функцию-член класса никаких указателей на экземпляр нет. Размер там больше т.к. там еще хранится метаинформация о классе ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2012, 15:32 |
|
||
|
Несколько вопросов начинающего программиста.
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyВ указателе на функцию-член класса никаких указателей на экземпляр нет. А откуда тогда заполняется this при её вызове? Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2012, 16:13 |
|
||
|
Несколько вопросов начинающего программиста.
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovAnatoly MoskovskyВ указателе на функцию-член класса никаких указателей на экземпляр нет. А откуда тогда заполняется this при её вызове? Чтобы вызвать указатель на метод надо предоставить this через специальный синтаксис: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2012, 16:40 |
|
||
|
|

start [/forum/topic.php?fid=57&tid=2020708]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
191ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
62ms |
get tp. blocked users: |
1ms |
| others: | 14ms |
| total: | 307ms |

| 0 / 0 |
