Как стать автором
Поиск
Написать публикацию
Обновить
0
0
Виктор @Demevag

Пользователь

Отправить сообщение

Статья безусловно интересная, но с примерами какая-то беда (нейронка генерила?)
Пример:

class StackAllocator {
public:
    StackAllocator(size_t size) {
        ...
        this->size = size;
    }
    ...
      
    void* allocate(size_t size) {
        if (top + size <= (char*)memory + this->size) {
            ...
        }
        return nullptr; // Нет памяти
    }

    void deallocate(void* ptr) {
        assert(ptr == top);
        top = (char*)top - sizeof(ptr); // Освобождение
    }
    ...

private:
    void* memory;
    void* top;
};
  • Член size не объявлен

  • В deallocate внезапно используем sizeof. Наверно всё таки нужна история аллокаций?

  • Указатели зачем-то void*, а потом касты везде насыпаны

    Также не раскрыта тема использования без отстрела ног: когда вызывать деструкторы? Как подружить с контейнерами?

Вопросов больше не имею, но вы многое теряете, как в USB, так и в C++

USB 1.0 - 1996
USB 1.1 - 1998
USB 2.0 - 2000
USB 3.0 - 2008
USB 3.1 - 2013
USB 3.2 - 2017
USB 4 - 2019
USB4 2.0 - 2022

Что-то не вижу тут разницы в 10 лет

А USB какого стандарта вы используете?

А для чего вообще нужно тело в замене std::declval?
Разве так не достаточно?

template<typename T>
constexpr T my_declval(); 

struct NonDefault
{
    NonDefault() = delete;
    int foo() const { return 1; }
};

int main()
{
   decltype(my_declval<NonDefault>().foo()) n = 42;
   return n;
}

https://godbolt.org/z/aoEKhfcs7

Имел удовольствие дописывать два проприетарных игровых движка - везде STL
Есть какая-то стигма у людей, застрявших в 98 году, что STL это зло и медленно, но практикой ещё никто не смог подтвердить
Понятно, что в узких местах, когда нужен специализированный контейнер/алгоритм, то можно взять boost/abseil/написать своё, но таких мест единицы

А можете раскрыть почему?
Потому что мне трудно понять, зачем писать на Си-с-классами, вместо использования современного языка и богатых библиотек

>Для своей реализации контейнера легко добавить внутреннюю функцию, использующую внешнюю: auto find_if(xxx) { return std::find_if(begin(), end(), xxx); }

А также rfind_if (+ конст версия) и find_if (конст версия) + итератор-адаптер туда не прокинуть

> Но сколько раз за все время вы писали свой контейнер?

Итераторы - это не только про контейнеры.

Кажется вы просто не оценили гибкость итераторов

> А сколько раз вы набрали begin(), end()

Выше уже написали, что сейчас есть range'и , если надоело печатать

Ох уж эти свидетели скорости Си и его близости к ассемблеру.

Можете подтвердить свои слова кодом на Си и кодом на Си++, который делает одно и то же, но Си выигрывает?

Статья безусловно полезная, спасибо , добавил в закладки

Но вот уже несколько месяцев ломаю голову над практическим применением stackless корутин и генераторов в частности. Может у вас есть несколько примеров?

Информация

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

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

Game Developer, System Software Engineer
C++
C
System Programming