Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Ещё несколько вопросов начинающего программиста
|
|||
|---|---|---|---|
|
#18+
Несколько недель назад задавал сюда кое-какие вопросы по языку, почти на все получил ответы, за что премного благодарен. За такое длительное время выявились ещё кое-какие пробелы в знаниях, которые хотелось бы устранить. 10. Правильно ли я понял, что безопасный с точки зрения исключений код -- это код, который при выбрасывании исключений в вызвавшую его функцию не даёт утечек памяти, а также не меняет состояние объекта? 11. Чем отличается size_t от int и других целочисленных типов? Для чего вообще нужен size_t? 12. Есть объект, созданный в не в куче, а у него поле, созданное в куче. Этот объект считать созданным в куче или нет? Тот же вопрос в том случае, когда объект создан в куче, а его поля -- на стеке. 13. Чем отличается operator new() от оператора new()? Один из них можно перегружать, дрйгой является встроенным, один из них вызывает другой... А зачем надобность сразу в двух похожих операторах? 14. f(new T1, new T2). Допустим, в теле функции f(...) сработало исключение. Очищается ли автоматически память, выделенная для T1 и T2? Если нет, то как её можно очистить, кроме как внутри функции f() (внутри, полагаю, кодом delete T1; delete T2;)? 15. Надо ли удалять указатели на функции подобно тому, как мы удаляем указатели на объекты? 16. При срезке обычно теряются члены дочерних классов. Допустим, дочерний класс занимал какое-то место в памяти. А куда всё девается область памяти, в которой содержатся члены дочернего класса, при преобразовании его в базовый класс, если речь именно о преобразованиях объекты, а не указателя или ссылки? Информация теряется, но происходит ли утечка памяти? 17. Если использовался размещающий new, то при исключении в конструкторе вызывается размещающий delete, который должен быть прописан, если же всё хорошо, вызывается обыкновенный delete. Верно ли, что для каждого из перегруженных new надо вызывать соответствующий перегруженный delete? 18. Верно ли, что ислючения всегда передаются по значению, даже если стоит что-то типа catch(ExepClass& ex){} или catch(ExepClass* ex){}, всё равно будет передана копия выброшенного объекта, а всякие ссылки и указатели нужны у catch только для полиморфизма? Если передана копия, то верно ли, что даже если try-catch стоят вместе (catch тут же отлавливает возможные исключения), то всё равно в catch передаётся копия выброшенного объекта? 19. Везде ли есть выравнивание? 20. Почему поля static не являются безопасными с точки зрения потоков? И верно ли, что для встроенных типов нет необходимости применять синхронизацию? 21. Что понимают под high frequency и low latency на C++? Почему плюсы считаются быстрее Java? Только из-за другого распределения памяти (в Java вся ответственность на сборщике мусора, что замедляет вычисления)? Почему другие языки не такие бытрые, как C++ и что им мешает быть быстрее? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2012, 01:08 |
|
||
|
Ещё несколько вопросов начинающего программиста
|
|||
|---|---|---|---|
|
#18+
ayvango10. Правильно ли я понял, что безопасный с точки зрения исключений код -- это код, который при выбрасывании исключений в вызвавшую его функцию не даёт утечек памяти, а также не меняет состояние объекта?Выделяют три уровня безопасности по исключениям. Вы можете почитать о них в статье David-а Abrahams-а, она есть на сайте буста в разделе статей. Если коротко то в порядке "возрастания безопасности": 1. Слабое. Утечек нет. Состояние неизвестно (можно сбросить до начального и идти дальше). 2. Сильное. Утечек нет. Состояние сохранено то, что было до вызова функции выбросившей исключение. 3. Исключений гарантированно не будет. Разные функции-(члены) и классы в целом стандартной библиотеки и других библиотек дают разные уровни безопасности по исключениям. Кроме того советую почитать статьи о моделях обработки исключений. ayvango14. f(new T1, new T2). Допустим, в теле функции f(...) сработало исключение. Очищается ли автоматически память, выделенная для T1 и T2? Если нет, то как её можно очистить, кроме как внутри функции f() (внутри, полагаю, кодом delete T1; delete T2;)? Порядок вычисления передающихся аргументов не известен. Поэтому такой код это верный способ получить утечку при исключении во втором вызвавшемся new. Дальше надо думать головой. ayvango16. При срезке обычно теряются члены дочерних классов. Допустим, дочерний класс занимал какое-то место в памяти. А куда всё девается область памяти, в которой содержатся члены дочернего класса, при преобразовании его в базовый класс, если речь именно о преобразованиях объекты, а не указателя или ссылки? Информация теряется, но происходит ли утечка памяти? Информация _не_ теряется если _не_ допускать банальную ошибку, объявлением деструкторов _невиртуальными_. Если у вас будут виртуальные деструкторы то апкаст ни к чему плохому не будет приводить. Если в базовом классе невиртуальный деструктор то будут утечки, связанные с невызовом деструктора потомка. ayvango17. Если использовался размещающий new, то при исключении в конструкторе вызывается размещающий delete, который должен быть прописан, если же всё хорошо, вызывается обыкновенный delete. Верно ли, что для каждого из перегруженных new надо вызывать соответствующий перегруженный delete? Не очень понятно что вы имеете в виду под термином "размещающий delete" это наверное чепуха какая-то :). Размещающий new не имеет парного delete. Он просто размещает объект созданный вызванным им же (размещающим new) конструктором в указанной области памяти. Удалять эту память, и вызывать деструкторы объектов в ней нужно будет ручками. Учебник повнимательнее читаем, о конструкторах, об исключениях :). Остальные вопросы в области RTFM. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2012, 10:14 |
|
||
|
Ещё несколько вопросов начинающего программиста
|
|||
|---|---|---|---|
|
#18+
Post Scriptum ayvango21. Что понимают под high frequency и low latency на C++? Почему плюсы считаются быстрее Java? Только из-за другого распределения памяти (в Java вся ответственность на сборщике мусора, что замедляет вычисления)? Почему другие языки не такие бытрые, как C++ и что им мешает быть быстрее? "Чтобы пятница настала быстрее, пить надо начинать в среду" (с). C++ не быстрее Java. Java не быстрее С++. Это все спорно. Так же как плюсники любят троллить сишников примером шаблонной функции sort которая работает быстрее чем сишный qsort, и здесь можно найти контрпримеры. Дело в другом. В коренном различии отношения к программисту, и в конечном итоге целях проектирования языка. С++ никогда не навязывал и хочется надеяться не будет навязывать определенную технологию программисту. Он всегда оставляет право выбора. "Дизайн и эволюция С++" это манифест языка свободы. Java, C# - решают за вас. Ты должен использовать сборщик мусора, а как он будет работать я беру на себя. Ты не должен использовать прямой доступ к памяти, а то наделаешь кучу ошибок. Ты не должен применять множественное наследование, потому что эта [marketing on]неправильная модель[marketing off] (и плевать что это неестественно, просто ты туп как сибирский валенок и не сможешь использовать его правильно). Ты не должен знать расположение объектов, мы их меняем на дню раза три. Ты не должен знать как работает низлежащее оборудование, а должен использовать средства параллельности которые в каждом случае выбраны за тебя. Вот тебе простенький "идеальный" виртуальный мирок живи в нем, а с реальностью мы уж как-то сами. Ленись, не развивайся, учи маркетинг вместо инженерии. The Matrix has you (c). Я не говорю что виртуальная машина упрощающая реальность это плохо. Это очень крутой механизм для применения (отличный пример встраиваемая lua или javascript). Плохо когда тебя "закубовывают в рай". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2012, 10:52 |
|
||
|
Ещё несколько вопросов начинающего программиста
|
|||
|---|---|---|---|
|
#18+
ayvango11. Чем отличается size_t от int и других целочисленных типов? Для чего вообще нужен size_t? У меня в _stddef.h написано: typedef unsigned int size_t; Так что это не отдельный тип, а int. ayvango15. Надо ли удалять указатели на функции подобно тому, как мы удаляем указатели на объекты? Интересно, зачем удалять указатели? Обычно они определяются, как переменные и обнуляются после удаления объекта. Код: plaintext 1. 2. 3. 4. 5. Или вы имели в виду такой пример? Код: plaintext 1. 2. 3. 4. 5. 6. 7. Конечно, же можно и указатели по new создавать, но обычно так создают массивы указателей, что-то вроде char** argv. Всё, что мы создаём при помощи new должно быть удалено. Правило такое. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2012, 12:12 |
|
||
|
Ещё несколько вопросов начинающего программиста
|
|||
|---|---|---|---|
|
#18+
У меня в _stddef.h написано: typedef unsigned int size_t; Так что это не отдельный тип, а int.Нет. Это тип, который в Вашем случае совпадает с int. А вообще, это тип, в который гарантированно влезет размер любого массива. Также именно этот тип возвращает sizeof. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2012, 12:29 |
|
||
|
Ещё несколько вопросов начинающего программиста
|
|||
|---|---|---|---|
|
#18+
AbstractionУ меня в _stddef.h написано: typedef unsigned int size_t; Так что это не отдельный тип, а int.Нет. Это тип, который в Вашем случае совпадает с int. А вообще, это тип, в который гарантированно влезет размер любого массива. Также именно этот тип возвращает sizeof. то есть вы хотите сказать, что в стандарте языка С++ есть тип size_t ? у меня и в хелпе написано, что это просто беззнаковый инт: size_t typedef ui-type size_t; The type is the unsigned integer type ui-type of an object that you declare to store the result of the sizeof operator. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2012, 12:37 |
|
||
|
Ещё несколько вопросов начинающего программиста
|
|||
|---|---|---|---|
|
#18+
Yatha, В working draft, выдаваемый Гуглом на первой позиции по запросу C++ standard, это раздел 5.3.3, п.6. Ссылка на актуальный стандарт у меня опять куда-то потерялась. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2012, 12:44 |
|
||
|
Ещё несколько вопросов начинающего программиста
|
|||
|---|---|---|---|
|
#18+
AbstractionYatha, В working draft, выдаваемый Гуглом на первой позиции по запросу C++ standard, это раздел 5.3.3, п.6. Ссылка на актуальный стандарт у меня опять куда-то потерялась. в пункте 5.3.3 п.6 написано The result is a constant of type std::size_t. [ Note: std::size_t is defined in the standard header <cstddef> (18.1). —end note ] Об этом я, в общем-то, и говорил. Что он определён дефайном и не является отдельным типом. А вот в пункте 3.9.1 Fundamental types такого типа нету. Написано, что есть 5 целых типов: 2 There are five signed integer types : “signed char”, “short int”, “int”, “long int” and “long long int”. In this list, each type provides at least as much storage as those preceding it in the list. Plain ints have the natural size suggested by the architecture of the execution environment44); the other signed integer types are provided to meet special needs. 3 For each of the signed integer types, there exists a corresponding (but different) unsigned integer type: “unsigned char”, “unsigned short int”, “unsigned int”, “unsigned long int”, and “unsigned long long int”, each of which occupies the same amount of storage and has the same alignment requirements (3.9) as the corresponding signed integer type45); that is, each signed integer type has the same object representation as its corresponding unsigned integer type. The range of nonnegative values of a signed integer type is a subrange of the corresponding unsigned integer type, and the value representation of each corresponding signed/unsigned type shall be the same. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2012, 13:27 |
|
||
|
Ещё несколько вопросов начинающего программиста
|
|||
|---|---|---|---|
|
#18+
sherzod_ayvango17. Если использовался размещающий new, то при исключении в конструкторе вызывается размещающий delete, который должен быть прописан, если же всё хорошо, вызывается обыкновенный delete. Верно ли, что для каждого из перегруженных new надо вызывать соответствующий перегруженный delete? Не очень понятно что вы имеете в виду под термином "размещающий delete" это наверное чепуха какая-то :). Размещающий new не имеет парного delete. Он просто размещает объект созданный вызванным им же (размещающим new) конструктором в указанной области памяти. Удалять эту память, и вызывать деструкторы объектов в ней нужно будет ручками. Учебник повнимательнее читаем, о конструкторах, об исключениях :). Видимо мне самому впору перечитывать учебник. Действительно такой термин имеет место быть. "placement form of operator delete." Судя по описанию placement delete это не совсем то о чем можно подумать. Ушел изучать... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2012, 13:47 |
|
||
|
Ещё несколько вопросов начинающего программиста
|
|||
|---|---|---|---|
|
#18+
Yatha, авторОб этом я, в общем-то, и говорил. Что он определён дефайном и не является отдельным типом.Он не фундаментальный тип. Но он тип, который (согласно стандарту) должен быть, и в отношении его гарантируется то, что не гарантируется в отношении int (это отвечая на вопрос ТС). Чем он реально определён - лично я считал бы это вопросом реализации. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2012, 13:59 |
|
||
|
Ещё несколько вопросов начинающего программиста
|
|||
|---|---|---|---|
|
#18+
Abstraction, формально, вы правы и это другой тип. Другое дело, что С++ это не Ада и, если написать int в качестве параметра функции вместо size_t, то даже warning не будети всё скомпилится. То же самое, если вместо NULL написать 0. А чем определён, так это, действительно, может зависеть от реализации. Ведь стандартом даже не определены размеры char, int, long int и long long int и они могут быть одинаковы по размерам. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2012, 14:28 |
|
||
|
Ещё несколько вопросов начинающего программиста
|
|||
|---|---|---|---|
|
#18+
YathaAbstraction, формально, вы правы и это другой тип. Другое дело, что С++ это не Ада и, если написать int в качестве параметра функции вместо size_t, то даже warning не будети всё скомпилится.варнинг как раз будет, потому что читайте внимательно: typedef unsigned int size_t; так что это не int, а без знаковый int, что, конечно, правильно. >> То же самое, если вместо NULL написать 0. ну а NULL - это вообще дефайн. Не рекомендуется этим макросом пользоваться, насколько я помню. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2012, 14:40 |
|
||
|
Ещё несколько вопросов начинающего программиста
|
|||
|---|---|---|---|
|
#18+
ayvango11. Чем отличается size_t от int и других целочисленных типов? Для чего вообще нужен size_t? 14. f(new T1, new T2). Допустим, в теле функции f(...) сработало исключение. Очищается ли автоматически память, выделенная для T1 и T2? Если нет, то как её можно очистить, кроме как внутри функции f() (внутри, полагаю, кодом delete T1; delete T2;)? 20. Почему поля static не являются безопасными с точки зрения потоков? И верно ли, что для встроенных типов нет необходимости применять синхронизацию? 11. size_t - это беззнаковый тип для хранения размеров объектов и индексов массивов. Если вы будете вместо него для этих целей использовать int/unsigned int/long и т.д. то у вас программа может работать на одной платформе, а на другой может не работать. Например у вас код: Код: plaintext 1. На 32битной платформе он сработает (поскольку вероятность выделения там объекта размером >2GB почти равна нулю) а на 64-битной будет переполнение для объектов >2GB. Есть еще знаковый вариант - ptrdiff_t, который предназначен для хранения разницы между двумя указателями. В принципе размеры size_t, ptrdiff_t, void* всегда равны и этот размер зависит от платормы и равен битности ее адресного пространства (32 бита - uint32_t, 64 бита - uint64_t). 14. Есть вполне безопасное решение этой проблемы - оборачивать каждый new в смартуказатель. 20. Поля static - глобальные, поэтому к ним всегда возможен доступ из разных потоков. Для встроенных типов необходимость синхронизации зависит от платформы. Например long long, double на 32-битной платформе неатомарные. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2012, 14:46 |
|
||
|
Ещё несколько вопросов начинающего программиста
|
|||
|---|---|---|---|
|
#18+
AbstractionУ меня в _stddef.h написано: typedef unsigned int size_t; Так что это не отдельный тип, а int.Нет. Это тип, который в Вашем случае совпадает с int. А вообще, это тип, в который гарантированно влезет размер любого массива. Также именно этот тип возвращает sizeof. Добавлю, что насколько я помню если компилируешь под 32 бита, то и size_t 32 битный unsigned int. А если под 64 бита, то size_t 64 битный unsigned long long. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2012, 15:14 |
|
||
|
Ещё несколько вопросов начинающего программиста
|
|||
|---|---|---|---|
|
#18+
egorychну а NULL - это вообще дефайн. Не рекомендуется этим макросом пользоваться, насколько я помню. Насколько я помню с точностью наоборот — не рекомендуется пользоваться 0 вместо NULL. Так как нет гарантии что на какой-нибудь платформе адрес 0 не используется для каких-нибудь своих целей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2012, 15:27 |
|
||
|
Ещё несколько вопросов начинающего программиста
|
|||
|---|---|---|---|
|
#18+
Yathaegorychну а NULL - это вообще дефайн. Не рекомендуется этим макросом пользоваться, насколько я помню. Насколько я помню с точностью наоборот — не рекомендуется пользоваться 0 вместо NULL. Так как нет гарантии что на какой-нибудь платформе адрес 0 не используется для каких-нибудь своих целей. Он наверное имеет ввиду использовать nullptr, который реализован почти во всех компиляторах, но не во всех. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2012, 15:37 |
|
||
|
Ещё несколько вопросов начинающего программиста
|
|||
|---|---|---|---|
|
#18+
Yatha wrote: >> Насколько я помню с точностью наоборот — не рекомендуется пользоваться 0 вместо NULL. Так как нет гарантии что на какой-нибудь платформе адрес 0 не используется для каких-нибудь своих целей да-да-да, это пишут изобретатели макроса NULL. Но мы то можем ведь и подумать самостоятельно. Ведь на самом деле, если у тебя в библиотечном заголовке написано #define NULL 0 то по фигу, что ты будешь писать в своём коде, 0 или NULL - один хрен, если "адрес 0 используется платформой для каких-нибудь своих целей" - то макрос NULL не спасёт. Единственное, что тут может помочь, это: >> Он наверное имеет ввиду использовать nullptr, который реализован почти во всех компиляторах, но не во всех. nullptr - добро, в отличие от NULL, дефайн любой может переобъявить, и вообще никогда не узнаешь, с каких хренов всё вдруг начало падать. Единственно, что на старых компиляторах, включая студию от 2008 года выпуска, он не реализован, приходится мучаться с нулями и нулами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2012, 15:47 |
|
||
|
Ещё несколько вопросов начинающего программиста
|
|||
|---|---|---|---|
|
#18+
egorychYatha wrote: >> Насколько я помню с точностью наоборот — не рекомендуется пользоваться 0 вместо NULL. Так как нет гарантии что на какой-нибудь платформе адрес 0 не используется для каких-нибудь своих целей да-да-да, это пишут изобретатели макроса NULL. Но мы то можем ведь и подумать самостоятельно. Ведь на самом деле, если у тебя в библиотечном заголовке написано #define NULL 0 то по фигу, что ты будешь писать в своём коде, 0 или NULL - один хрен, если "адрес 0 используется платформой для каких-нибудь своих целей" - то макрос NULL не спасёт. Изобретатели макроса NULL — это как раз создатели языка Си :) В стандарте используется как раз NULL, а не 0. А если "адрес 0 используется платформой для каких-нибудь своих целей" то макрос NULL как раз таки спасёт, ибо для этой платформы он будет определён, например, как #define NULL 0xffff и код останется переносимым. А с 0 вместо NULL на такой платформе будут косяки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2012, 16:03 |
|
||
|
Ещё несколько вопросов начинающего программиста
|
|||
|---|---|---|---|
|
#18+
nullptrОн наверное имеет ввиду использовать nullptr, который реализован почти во всех компиляторах, но не во всех. Я пишу на C++ Builder XE. Там он не реализован. nullptr Description Reserved for future use. nullptr is a literal that can be assigned to any pointer to indicate the pointer doesn't point to anything. Warning: C++Builder does not implement nullptr but does treat it as a keyword when the -Ax compiler flag is set. Do not use nullptr as an identifier. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2012, 16:08 |
|
||
|
Ещё несколько вопросов начинающего программиста
|
|||
|---|---|---|---|
|
#18+
YathaВ стандарте используется как раз NULL, а не 0.да, согласен. Но nullptr - всё равно лучше ))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2012, 16:16 |
|
||
|
Ещё несколько вопросов начинающего программиста
|
|||
|---|---|---|---|
|
#18+
egorychЕдинственное, что тут может помочь, это: >> Он наверное имеет ввиду использовать nullptr, который реализован почти во всех компиляторах, но не во всех. nullptr - добро, в отличие от NULL, дефайн любой может переобъявить, и вообще никогда не узнаешь, с каких хренов всё вдруг начало падать. Единственно, что на старых компиляторах, включая студию от 2008 года выпуска, он не реализован, приходится мучаться с нулями и нулами. Хочу открыть страшную-престрашную тайну. Можно и nullptr переопределить. Например, #define nullptr 100. Да что там nullptr. Можно и int переопределить, например, #define int char, а потом думать, почему не компилится. Ну, и классика жанра, конечно: #define true false ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2012, 16:17 |
|
||
|
Ещё несколько вопросов начинающего программиста
|
|||
|---|---|---|---|
|
#18+
nullptr появился в С++11. В С и С++2003 и раннее его нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2012, 17:25 |
|
||
|
Ещё несколько вопросов начинающего программиста
|
|||
|---|---|---|---|
|
#18+
автор10. Правильно ли я понял, что безопасный с точки зрения исключений код -- это код, который при выбрасывании исключений в вызвавшую его функцию не даёт утечек памяти, а также не меняет состояние объекта? Да, чаще всего ещё и без требования неизменности состояния объекта. автор11. Чем отличается size_t от int и других целочисленных типов? Для чего вообще нужен size_t? Это специальный тип для хранения размера объекта. Дело в том, что размеры int long и void* не определены стандартом и в принципе везде разные. А size_t, который должен хранить любую разницу между двумя void* -- вообще был бы не понятно какого типа, если бы не было size_t в явном виде. автор12. Есть объект, созданный не в куче, а у него поле, созданное в куче. Этот объект считать созданным в куче или нет? Нет, этот объект создан не в куче (на стеке, в глобальной памяти или ещё как). авторТот же вопрос в том случае, когда объект создан в куче, а его поля -- на стеке. Это -- ошибка проектирования Объект при этом создан естественно в куче. Только как он будет жить при выходе из скопа автоматических объектов, на которые он ссылается -- не понятно. Такое иногда допустимо, если он ссылается на автоматические переменные в функцие main, например. автор13. Чем отличается operator new() от оператора new()? Один из них можно перегружать, дрйгой является встроенным, один из них вызывает другой... А зачем надобность сразу в двух похожих операторах? Видимо, речь идёт о обычном new и placement new ? Уточни... автор14. f(new T1, new T2). Допустим, в теле функции f(...) сработало исключение. Очищается ли автоматически память, выделенная для T1 и T2? Если нет, то как её можно очистить, кроме как внутри функции f() (внутри, полагаю, кодом delete T1; delete T2;)? Тонкий момент. Точно не знаю. Видимо, не должна очищаться. При аналогичном почти случае внутри инициализаторов конструктора очищается автоматом. автор15. Надо ли удалять указатели на функции подобно тому, как мы удаляем указатели на объекты? Надо, если ты выделял функцию динамически, с помощью new. поскольку это сделать в С++ (пока по крайней мере) нельзя, то это "надо" не наступает никогда. автор16. При срезке обычно теряются члены дочерних классов. Допустим, дочерний класс занимал какое-то место в памяти. А куда всё девается область памяти, в которой содержатся члены дочернего класса, при преобразовании его в базовый класс, если речь именно о преобразованиях объекты, а не указателя или ссылки? Информация теряется, но происходит ли утечка памяти? Срезка происходит только при копировании самого объекта. При присваивании, при возврате объета по значению. При этом обычно объекты находятся: исходный -- всё равно где и не меняется, результирующий -- на стеке (при возврате), либо там, где его определили при присваивании. В любом случае проблем с памятью не возникает и утечек никаких нет. автор17. Если использовался размещающий new, то при исключении в конструкторе вызывается размещающий delete, который должен быть прописан, если же всё хорошо, вызывается обыкновенный delete. Верно ли, что для каждого из перегруженных new надо вызывать соответствующий перегруженный delete? Нет, на сколько я понимаю вопрос. new может быть наперегружен дофига как, фактически ты можешь указать у new любое кол-во любых аргументов. А delete этим всем new будет соответствовать только один. автор18. Верно ли, что ислючения всегда передаются по значению, Куда передаются ? Исключения -- это обычные объекты, если ты их используешь по-обычному, они передаются так же, как объекты во всех других случаях (слово "объект" тут означает не только объекты классов, но и объекты встроенных типов С++). Если при выкидывании исключения имеется в виду в вопросе -- тогда ровно так они передаются, как идёт выкидывание. Если кидается сам объект, происходит передача по значению, если адрес выкидываетсы -- то по указателю. Т.е. с учётом семантики указателей можно сказать, что передаётся при TROW объект всегда по значению (т.е. если выкидывается указатель, то по значению передаётся указатель). автордаже если стоит что-то типа catch(ExepClass& ex){} или catch(ExepClass* ex){}, всё равно будет передана копия выброшенного объекта, а всякие ссылки и указатели нужны у catch только для полиморфизма? Нет, это совсем неверно. Если будет кидаться объект по значению, а ты будешь ловить указатель, то просто данный catch ничего не поймает. И наоборот, если кидается указатель, а ловится ссылка или значение, тоже не поймаешь. Ловля по значению и по ссылке отличается лиш тем, что при ловле по значению происходит дополнительное копирование (и возможно срезка). авторЕсли передана копия, то верно ли, что даже если try-catch стоят вместе (catch тут же отлавливает возможные исключения), то всё равно в catch передаётся копия выброшенного объекта? Да. автор19. Везде ли есть выравнивание? Стандарт не определяет это. Так что ничего об этом сказать нельзя. Где-то оно есть, где-то его нет. Сказать, что оно есть везде, нельзя. Сказать, что его нигде нет -- тоже. автор20. Почему поля static не являются безопасными с точки зрения потоков? Поля сами не могут являться или не являться потокобезопасными, являеться или не являеться потокобезопасным только конкретный случай использования такого поля. Если имеется в виду поле класса со static, то оно его можно использовать потокобезопасно или нет, равно как и нестатические поля класса можно использовать и так, и так. Потокобезопасность -- свойство кода по отношению к данным, а не самих данных как таковых. авторИ верно ли, что для встроенных типов нет необходимости применять синхронизацию? Нет. В корне неверно. автор21. Что понимают под high frequency и low latency на C++? Это не имеет отношения к С++, выходит за его рамки. Не имеет смысл обсуждать. авторПочему плюсы считаются быстрее Java? Код: plaintext Потому что C++ рулез а Java -- говно голимое. На самом деле конечно нельзя сказать, что С++ быстрее Java. Можно сказать только, что конкретная программа на С++ быстрее аналогичной на Java или наоборот. Кстати, наоборот вполне возможно, это часто связано с выделением памяти -- Java-программам часто память даётся большими кусками, и на выделении получается экономия. В С++ же дефолтный (и иногда единственный) хип может быть не самым лучшим для данного алгоритма работы или вообще плохим по жизни (это зависит от реализации компилятора, а не от языка, это не С++ плохой, а конкретная реализация) авторТолько из-за другого распределения памяти (в Java вся ответственность на сборщике мусора, что замедляет вычисления)? Вот тут есть один момент, который существенно влияет на "почему плюсы считаются быстрее Java". В Java часто (почти всегда) перераспределение памяти может возникать в любой момент работы программы. Ну вообще просто тупо почти всегда. Поэтому её не любят создатели ПО, которое расчитано на маленькие задержки, или почти или полностью realtime. Ну действительно -- ты тут считашь что-то, считаеш, торопишся, ещё милисекудна, ещё пол милисекунды осталось -- а тут бац -- и сборщик мусора заработал. В С++ выделение и освобождение памяти всегда детерминировано, предсказуемо. Когда оно произойдёт -- всегда известно. Поэтому такое ПО писать легче. авторПочему другие языки не такие бытрые, как C++ и что им мешает быть быстрее? Ну, это уж вообще философский вопрос -- наверное, надо "спрашивать" у тех языков об этом. Языков много, все разные... Есть языки ничуть не менее быстрые чем С++, С например, Паскаль, Fortran. Да и много других. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2012, 22:29 |
|
||
|
Ещё несколько вопросов начинающего программиста
|
|||
|---|---|---|---|
|
#18+
sherzod_ayvango14. f(new T1, new T2). Допустим, в теле функции f(...) сработало исключение. Очищается ли автоматически память, выделенная для T1 и T2? Если нет, то как её можно очистить, кроме как внутри функции f() (внутри, полагаю, кодом delete T1; delete T2;)? Порядок вычисления передающихся аргументов не известен. Поэтому такой код это верный способ получить утечку при исключении во втором вызвавшемся new. Дальше надо думать головой. ayvango16. При срезке обычно теряются члены дочерних классов. Допустим, дочерний класс занимал какое-то место в памяти. А куда всё девается область памяти, в которой содержатся члены дочернего класса, при преобразовании его в базовый класс, если речь именно о преобразованиях объекты, а не указателя или ссылки? Информация теряется, но происходит ли утечка памяти? Информация _не_ теряется если _не_ допускать банальную ошибку, объявлением деструкторов _невиртуальными_. Если у вас будут виртуальные деструкторы то апкаст ни к чему плохому не будет приводить. Если в базовом классе невиртуальный деструктор то будут утечки, связанные с невызовом деструктора потомка. Видимо, тут sherzod_ абсолютно не понимает, о чём речь идёт. При чём там порядок вычислений в первом случае и виртуальные деструкторы во втором -- вообще не понятно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2012, 22:32 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=38056304&tid=2020626]: |
0ms |
get settings: |
11ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
59ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
81ms |
get tp. blocked users: |
1ms |
| others: | 17ms |
| total: | 199ms |

| 0 / 0 |
