Pull to refresh
14
0.1
Алексей Ткаченко @a-tk

Разработчик ПО

Send message

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

template<class T, int Id = 0>
T& instance()
{
  static char data[sizeof(T)];
  static bool initialized;

  if (!initialized)
  {
    initialized = true;       
    new(data)T();
  }
  return *reinterpret_cast<T*>(data);
}

instance<Timer>();
instance<Channel, 0>();
instance<Channel, 1>();

И память статически размещена, и накладных расходов минимум (потому что блокировки на многопоточную инициализацию нет), и отложенная инициализация до первого вызова.

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

На заводе тоже можно угодить под пресс

-- Почему вы выбрали именно нашу компанию?

-- Меня привело сюда броуновское движение!

Ошибку в коде сами найдёте?

А для большого n есть варианты и быстрее.

Чтобы сказочно разбогатеть, можно выдать подобную же годноту!

Я просто оставлю это здесь: https://devblogs.microsoft.com/dotnet/await-anything/

А эти, с позволения сказать, ножницы, можно пинать?

6. Бассейн потоков

Занавес.

А если по существу, это задумывалось как перевод, осмысленная компиляция или копипаста?

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

Что, например, такого произошло с языком Ada, что он в апреле 2025 достиг исторического пика своей популярности, с начала года удвоив оную?

Все два деда в универе решили дать студентам на нём лабы?

В стародавние времена то, что написано капсом, воспринималось как крик. Собственно поэтому всякие макросы в сях и константы буквально кричат капсом.

Ещё надо трекать ссылки на другие объекты. Возможно, циклические.

Разницы нет, пока не надо задумываться об этом при интеропе. Стандартом де-факто является интероп с Си. А там нумерация с 0, потому что это следует из арифметики указателей.

ОНО ЖЕ ПРОКРИЧАЛО, что дальше больше не safe, но это Вас не остановило.

Когда 17-18 лет назад выбирал скриптовый язык в проект, предпочтение было отдано именно Squirrel-у. Lua и Python рассматривались тоже, но проиграли.

Вообще говоря обязан.

Исключения должны подниматься там, где корректная работа в сложившейся программной среде не представляется возможным, а обрабатываться они должны там, где становится возможным восстановиться после исключения.

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

Ну или не восстановиться, что укажет на баг. Только аккуратно, с логированием, чтобы это было не просто падение, а что-то осмысленное. Но потом обязательно прекратить работу, чтобы не запороть пользовательские данные.

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

Для таких ситуаций и есть иерархия исключений с корневым типом на все оставшиеся случаи жизни.

В греческом угаре unsafe нужен исключительно для указателя в делегате, а не для греков.

1
23 ...

Information

Rating
3,608-th
Location
Минск, Минская обл., Беларусь
Date of birth
Registered
Activity

Specialization

Software Developer, Software Architect
Lead
From 1,000,000 $
C#
.NET
C++
Git