Ned
orly?
Ned
вот ведь обидно
Ned
а почему так? чем это обусловлено?
T3ch
На момент компиляции компилятор ничего не знает о параметризации темплейта
T3ch
А вот в конкретном месте, где будет определён Шаблонный параметр - компилятор сможет подставить параметр и скомпилять класс.
Ned
хорошо, я не могу даже нормально объявить конструктор. чего он хочет? неважно даже, в одном файле или нет
Ned
или прям в классе реализовывать?
T3ch
Нет, можно не в классе
T3ch
Какая сигнатура конструктора в реализации вне класса? Скорее всего с этим проблема
Ned
вот класс
Ned
Вот код класса: template <typename T> class Matrix { private: int rows, cols; T *data; public: Matrix(int _rows, int _cols); ~Matrix(); };
Ned
сигнатура такая же, точь-в-точь, копипаста
Ned
объявляю Matrix::Matrix(int _rows, int _cols){}
T3ch
А темлейт куда делся?)
Ned
ошибка: In file included from test.cpp:2:0: ./matrixlib.h:15:1: ошибка: некорректное использование имени шаблона «Matrix» без списка аргументов Matrix::Matrix(int _rows, int _cols){} ^~~~~~
T3ch
Ну, явно же ругается
Ned
Ned
вот с темплейтом
Ned
я лично не вижу проблем
T3ch
Заюзай реализацию прямо в классе, сейчас нет возможности проверить
Ned
а ларчик просто открывался
Anonymous
Таки как он открылся? )
Egor
Во второй секции, кстати, надо было кроме теоретических вопросов написать shared_ptr
а что в этом сложного? В простейшем варианте - структура в памяти с двумя счётчиками и указателем на данные. По обнулению первого счётчика данные удаляются, по обнулению обоих - удаляется структура.
Egor
Таки как он открылся? )
наверняка как-нибудь так: template <typename T> class Matrix { private: int rows, cols; T *data; public: Matrix(int _rows, int _cols): rows ( _rows ) , cols ( _cols ) { data = new T[rows * cols ]; } ~Matrix() { delete[] data; } };
Ned
Таки как он открылся? )
template <class T> Matrix<T>::Matrix(int _rows, int _cols): rows(_rows), cols(_cols){ data = new T[rows*cols]; }
Ned
Забыл <T> после Matrix
Ned
Новый вопрос: есть ли способ разрушить объект на момент создания? То есть, в рантайме вызывается конструктор, который проверяет корректность входных данных, и если встречается ошибка, нужно порушить объект. Из ит риал?
Ned
Или только аварийная остановка программы?
Ned
Или это вообще bad style?
🦥Alex Fails
throw
Ned
Кстати, почему парятся людие о засранной памяти, delete, итд, если система отлавливает эти ситуации и при завершении программы попросту помещает страницы в список свободных?
🦥Alex Fails
Блядь. Это супапро
Ned
А если у тебя сервак который работает по несколько месяцев
Ось, тем паче серверная, должна быть к этому готова. Если прога постоянно что-то создаёт и забывает стирать, засирая всю память, включается статистический сборщик мусора, не?
Ned
Блядь. Это супапро
Я всё понимаю, но я задаю вопрос более широкий, чем "зачем new delete". Это уже из области моего любимого osdev;)
Ned
А как она узнает, что твой быдлокод не будет использовать этот кусок памяти? Никак
Так ведь статистика обращений к страницам. Как узнаёт сборщик джавы? Отсутствие ссылок на объект, например.
Ned
А как она узнает, что твой быдлокод не будет использовать этот кусок памяти? Никак
В любом случае прога покрэшится: либо ОСь откажет в выдаче памяти в куче, либо попросту обратится в вычищенный кусок. Если полагать, что прог много и все хотят памяти, лучше обеспечить работоспособность всех, ценой убийства одной. Об остальном пусть парится разраб.
Ned
Следовательно, выгоднее статистически затирать страницы.
Ned
Я просто попутно проектирую mm своей микро-ОСи и задумался об эдаких механизмах
🦥Alex Fails
В любом случае прога покрэшится: либо ОСь откажет в выдаче памяти в куче, либо попросту обратится в вычищенный кусок. Если полагать, что прог много и все хотят памяти, лучше обеспечить работоспособность всех, ценой убийства одной. Об остальном пусть парится разраб.
Вот ты как осдев знаешь, что сишная программа умеет только маллок и фри, а ос ей просто мапит кусок памяти в виртуальное адресное пространство. Если у тебя внезапно выделенный кусок памяти через маллок станет невалидным без вызова фри, то это значит, что у тебя произошло то, что нарушает семантику этих функций
Egor
Так ведь статистика обращений к страницам. Как узнаёт сборщик джавы? Отсутствие ссылок на объект, например.
И как это соотносится с си и плюсами? Может ты в память константную строку загнал, и что случится если её удалить?
🦥Alex Fails
Ты можешь сделать свое апи в твоей микрооси, которое включит этот сборщик мусора, но при разработке софта надо будет учитывать этот факт
Egor
Кстати, почему парятся людие о засранной памяти, delete, итд, если система отлавливает эти ситуации и при завершении программы попросту помещает страницы в список свободных?
не хочешь париться о засранной памяти - не используй си и плюсы, используй яву, питон или шарп, где есть сборщик. А есть ещё эмбедед направление, там не только о засранной памяти парятся, там даже о выделении памяти в процессе работы парятся, ибо в идеале и этого не должно быть.
Egor
Тогда к этой строке будут обращаться.
раз в день, когда приходит отчёт от железки, например?
Ned
Да, есть резон
Ned
В твоих речах
🦥Alex Fails
раз в день, когда приходит отчёт от железки, например?
Вотпример. По статистике эта строчка будет вызываться редко, и ее в утиль отправит ос
Anonymous
https://youtu.be/JfmTagWcqoE
Egor
Тут Саттер рассказывает про "сборщик" на плюсах
там же всё на умных указателях, посчёте ссылок и без сборщика мусора как такового, вроде. Если я выступление не путаю.
Anonymous
Ну да, но смысл то тот же - удаление объектов когда они уже не используются
Artem
А ты хочешь, чтобы тебе рантайм ссылки считал, а не на уровне языка?
Anonymous
Только сборщик возвращает память как я понимаю, а тут деструкторы вызываются
Artem
смысл любого gc тот же
Egor
смысл сборщика в его отложенном вызове. наступает какой-то период и весь "мусор" с нулевыми ссылками удаляется скопом, а стратегия модерн плюс - удаление ровно в момент обнуления ссылки.
Egor
более точно управление временем жизни, меньше вопросов по освобождению памяти и всё такое.
Egor
это как бы не сборщик в том понимании, какое есть в яве или шарпе, это именно управление временем жизни объекта.
Artem
но не такое управление жизнью объекта, как в расте!
Egor
не знаком с растом, не могу сравнить :)
Artem
https://doc.rust-lang.org/beta/book/lifetimes.html
Artem
(может показаться, что пунктуации в языке немного больше, чем нужно, да, это так)
Egor
https://doc.rust-lang.org/beta/book/lifetimes.html
или я не понял синтаксиса, или там речь идёт только о статике, которая и может быть вычислена на этапе компиляции (так в плюсах можно то же самое), а не о динамике
Artem
Нет. Раст просто умеет на этапе компиляции понимать больше, чем c++. То, что в С++ упадет в рантайме (давайте передадим овнершип unique_ptr куда-нибудь и потом вызовем еще раз), в расте не скомпилируется
Egor
Нет. Раст просто умеет на этапе компиляции понимать больше, чем c++. То, что в С++ упадет в рантайме (давайте передадим овнершип unique_ptr куда-нибудь и потом вызовем еще раз), в расте не скомпилируется
auto pint1 = std::make_unique< int > (); auto pint2 = std::move( pint1 ); if ( pint1 ) *pint1 = 10; if ( pint2 ) *pint2 = 42; да, рантайм, но накладных расходов не больше чем с сырыми указателями, и да, если правильно писать не упадёт.
Алдар
через лет 5 раст будет норм
Artem
Если правильно писать, то и с сырыми не упадет, вопрос в количестве способов выстрелить в ногу
Artem
Выстрелить в ногу? Возможно конечно
Egor
я тут питон не могу доучить до нужной кондиции, а ещё и раст рекламируют...блин, где бы свободного времени взять чтоб всё новое учить и быть в потоке
Artem
Раст пока что для энтузиастов
dµks
Информацию фильтровать же надо, ну. Если учить все то можно слегка поехать
Artem
Питон учить практичнее
Artem
Да и проще