Обновить
66
Андрей@DistortNeo

Математик, программист

24
Подписчики
Отправить сообщение
Нехватка памяти практически всегда фатальна. В этом случае нужно как можно корректнее завершить приложение, а не пытаться продолжать работать.

А ещё хуже — исключение из деструктора, когда сам объект ещё числится в списках.

Обращение программистам: никогда не бросайте исключения в деструкторе. Даже если очень хочется. Создайте метод Close или Dispose, но руки прочь от деструкторов. Рассматривайте деструкторы как механизм аварийного удаления объекта.

Принцип RAII хорош, но не может быть применён для всего, чего только можно.
Значит что-то сильно поменялось в С++ за 25 лет. В Borland C++ 3.1 он вызывался, насколько помню.

Когда я попытался в нём ради интереса написать, я просто не смог его скомпилировать. Это не C++.

Это тонкости. У Borland память объекта обнуляется до конструктора, поэтому неинициализированный член класса — это NULL.

Неинициалилизированный — значит, не имеет никакого значения. Если член класса имеет значение NULL, значит, он уже инициализирован. Нулём.
я отстал от жизни? Конструктор объекта выделил память одним new, вторым, третьим и на четвертом словил исключение. И что, не запустится деструктор и выделенная память утечет?

Видимо, отстали. Современное программирование на C++ предполагает использование умных указателей. Если в коде нет ни одного delete — это хороший код, если ни одного new (кроме случаев, где он оправдан, например, в низкоуровневых библиотеках) — это прекрасный код.

Если конструктор бросает исключение, то будет вызван не пользовательский деструктор, а деструктор по умолчанию. Он просто вызовет деструкторы для всех полей и освободит память под текущий объект. При этом, если исключение было выброшено не в теле функции конструктора, а инициализатором поля, т.е. класс не полностью инициализирован, то деструкторы будут вызваны только для уже инициализированных полей.

Можно. Если даже компилятор не инициализирует память объекта нулями, то нам ничего не мешает присвоить полям-указателям NULL, а потом — вызвать new.

Если вы вручную выделяете память, то обязаны вручную же её и удалять.

У простых полей деструктор по умолчанию пустой. Если вы выделяете память в инициализаторах полей, то будет утечка.

Если же вы хотите сначала полностью проинициализировать поля класса нулями, а выделять память в конструкторе вручную, то придётся позаботиться и о ручном освобождении памяти, поставив catch и запихнув в него код очистки.
Это не trade-off — это фича, важная для OoOE. Если не обнулять верхнюю половину, то следующая после xor edi, edi инструкция, использующая rdi, будет иметь зависимость и от xor, и от предшествовавшей инструкции, использовавшей rdi. Лишние зависимости делают невозможными перестановки инструкций.

В таком случае, достаточно было бы обнулить верхнюю половину регистра самостоятельно (xor rdi, rdi).

Дело не столько в зависимостях, сколько в необходимости сохранения (=копирования) верхней части регистра одновременно с выполнением операции над нижней частью, а это усложнение конвейера и реализация дополнительных ФУ. Никогда не замечали, что операции с 32-битными целыми выполняются быстрее, чем с 8 и 16-битными целыми?
Инструкция xor edi,edi в 64-битном режиме обнуляет весь rdi, так что нет никакого «наполовину обнулённого» регистра.

Да, любая инструкция с 32-битными операндами будет обнулять старшие 32 бита. Просто trade-off между скоростью работы и сложностью аппаратной реализации регистров.

А почему именно
xor edi, edi
а не
xor rdi, rdi
: да потому что первая команда на 1 байт короче.
Раньше было много R&D центров и просто офисов западных компаний. Сейчас из-за законодательных маразмов они начинают сворачивать деятельность. Причём не только политических, но и налоговых, пытаясь скомпенсировать дефицит бюджета из-за низких цен на нефть.

Также есть локализация производств (сборка техники), то это уже не аутсорсинг, т.к. оно всё идёт на внутренний рынок.
А то, что это приводит к аутсорсингу и, в конечном итоге, положительно сказывается на экономике.
1) 100 ГДж — это энергия, которую аппарат суммарно должен получить. Если такую энергию передать мгновенно, то аппарат разогреется до миллионов градусов и в нём начнётся термоядерный синтез.
2) Можно пытаться использовать свет/энергию удалённой звезды, но явно не на 20% от скорости света.
А где написано, что это — мощность? Чтобы разогнать тело до определённой скорости, нужно приложить определённую энергию. 1 тераджоуль — огромная цифра, поэтому и нужны мощные лазеры, чтобы за разумное время эту энергию передать.
Да, пока молодой, то инвестировать в себя (образование, карьера, здоровье) и детей, в недвижимость, но не в пенсионные фонды. Если есть желание и возможности — инвестировать самостоятельно, понимая все риски.

> ни одна страховая компания и ни один пенсионный фонд не доживёт до того счастливого момента, когда вы заходите воспользоваться пенсионным накопительным вкладом
Поэтому в российских условиях распределительная система предпочтительнее, чем накопительная.
Заводите отношения с такими же разработчиками — проблем с общением не будет.
Предпосылки для создания собственного оборудования действительно есть. Почему Китай выбился в лидеры? Потому что была дешёвая рабочая сила и ресурсы — западным компаниям было выгодно аутсорсить производство электроники. Ну а количество в итоге перешло в качестве. Сейчас в России средняя зарплата ниже, чем в Китае — надо этим пользоваться.
Нормальное и без закладок тоже есть — транспондеры на собственной элементной базе, но скорости там — мегабиты, а не десятки гигабит. Военным поставляют их.
К слову, наши производители только-только пытаются вывести на рынок транспондеры (на пальцах: передатчики данных по оптоволокну на большой скорости). Электроника, к сожалению, почти полностью китайская, прошивки — полностью свои, по цене в 3-4 раза получается дешевле.
Неудивительно. Huawei имеет огромный опыт разработки подобного оборудования для нужд Китая, производя продукцию, не имеющую аналогов. Ну и агрессивная политика компании на грани фола, поддерживаемая государством, даёт преимущество перед многими западными компаниями.
А на втором слое не повыкидывали за ненадобностью, а обработали, причём сурово: свёртками с трёхмерными ядрами. Вычислительные затраты здесь высоки. А потом третий слой, а потом на выходе снова 512х512, потому что именно это мы и хотели получить.

Все равно не понимаю, что вы имеете в виду. Свёртка — это математическое преобразование, не именяющее размерности. Размерность увеличивается, если используется несколько свёрток. И уменьшается, если выполняется, например, усреднение по какой-нибудь из размерностей.
Я вообще стараюсь избегать слова «интеллект», потому что ассоциирую его исключительно с человеческими способностями.
Свёрточным нейронным сетям нужны очень большие объёмы данных для адекватного обучения. Добавление третей размерности при текущем уровне развития теории просто сделает обучение невозможным или сильно ограниченным из-за необходимости подготовки данных для обучения.
> Свёртка это ещё и преобразование сильно, очень очень сильно снижающее размерность входных данных
Ошибаетесь. Свёртка — это просто вычисление признака, причём довольно затратное.

Для каждого пикселя можно вычисляться сотня таких признаков. Теперь представьте себе: была картинка 512х512, после первого слоя стала 512х512х100. Где тут уменьшение размерности?
Касательно «Тренер ИИ»: похожие вещи сейчас и происходят. Правда, набираются не именно тренеры, а «генераторы» данных — эксперты, способные создавать и размечать данные для обучения.

Если в некоторых задачах, например, увеличения изображений всё просто: данные генерировать легко, то в задачах обработки и анализа медицинских изображений не всё так просто. Создание и разметка базы изображений требует вполне реальных затрат, включающих в себя затраты на труд экспертов-медиков.

Информация

В рейтинге
Не участвует
Откуда
Сербия
Дата рождения
Зарегистрирован
Активность

Специализация

Бэкенд разработчик
Старший