Перейти к содержанию
    

VladislavS

Свой
  • Постов

    1 239
  • Зарегистрирован

  • Посещение

  • Победитель дней

    9

Сообщения, опубликованные VladislavS


  1. 56 минут назад, RR2021 сказал:

    Пока что делаю так  сначала умножил на 10 , перевёл в int, потом прибавил 1 перевёл во float, и разделил на 10 

    Мои глаза!!! 

    Что это изменит? Значение 1.1 во float не представимо точно.

    image.png.ca63230473357b6b41c8fe94908ef67e.png

     

  2. 1 час назад, razrab83 сказал:

    которая инитится в main

    У меня для совместимости с разными компиляторами (тулчейнами) вот такая конструкция используется

    #ifdef __cplusplus
    extern "C" {
    #endif
    
    #ifdef __ICCARM__
      int __low_level_init(void)
    #else
      void SystemInit()
    #endif
    {
    
      // Код инициализации железа
    
    #ifdef __ICCARM__
      return 1;
    #endif
    }
    
    #ifdef __cplusplus
    }
    #endif

     

    35 минут назад, EdgeAligned сказал:

    Во внешней SDRAM хранить одиночные переменные или малые объемы данных - неэффективно.

    А с чего вы взяли что там одиночная переменная? Ясно же, что пример тестовый, что там реально в куче ХЗ.

  3. 22 минуты назад, amaora сказал:

    А кто-нибудь здесь пишет

    Не знаю это ли вы имеете в виду. Вот у меня в одной из библиотек обработчик прерываний USB. В нём IRQHandlers это список типов. Для каждого элемента списка выполняется лямбда.image.thumb.png.e87d0779ee24b07eb56ae9eaa5099ef5.png

    А сам список зависит от реализуемого класса. Например, для CDC обработчики двух конечных точек.

    image.thumb.png.c6fd84ce0b4a5c27c4325cf08500ff71.png

     

     

     

    3 минуты назад, Arlleex сказал:

    Опять же - это ведь не переменная, а константа.

    Вообще-то переменная. Изменять нельзя, правда. :)))

    4 минуты назад, Arlleex сказал:

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

    Это и в православном С так было со статическими локальными переменными.

  4. 1 час назад, Arlleex сказал:

    Насчет предикатов, функторов, лямбд: насколько я понял, их ценность кроется, в основном, при работе со стандартной библиотекой.

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

    1 час назад, Arlleex сказал:

    почему следующая строчка не вычисляется в compile-time?

    В смысле?

    auto constexpr X = 100;
    auto Y = 100;
    
    auto func() 
    {
      int constexpr i = X<<2;  // Компайлтайм, Ok
      int constexpr I = Y<<2;  // Рантайм, ошибка
    }

     

    1 час назад, Arlleex сказал:

    Стоит добавить static перед объявлением, как выражение полностью становится compile-time.

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

    1 час назад, Arlleex сказал:

    не помню как насчет -O0

    и это не зависит от оптимизации. При любой оптимизации должно быть вычислено на этапе компиляции.

    1 час назад, Arlleex сказал:

    Единственное, какого-то вменяемого полного описания constexpr-выражений и функций, constexpr if() найти не просто

    Да вроде всё просто:

    1. constexpr переменные (читай константы). Они всегда должны быть инициализированы значением вычисленным на этапе компиляции.

    2. constexpr функции. Они могут работать как в компайлтайме, так и в рантайме. В первом случае (когда все условия сложились) их значения можно использовать там где подразумевается константа этапа компиляции: параметры шаблонов, инициализация constexpr переменных, if constexpr()... Если значение нельзя в компайлтайме вычислить, то работает как обычная функция в рантайме. В С++20 появилось более жёсткое consteval, которое не пускает функцию в рантайм.

    3. if constexpr() Тут всё просто. Выражение "под условием" должно быть вычислено на этапе компиляции. 

    • Upvote 1
  5. Про специализацию шаблонов. Появившийся в С++17 if constexpr превратил специализацию функций и методов в привычное функциональное программирование, которое даже не воспринимается как специализация. В С++20 появились концепты, которые позволяют гибко специализировать классы. SFINAE ушёл в прошлое. Достаточно просто слезть с броневичка и пользоваться имеющимся инструментом.

  6. 27 минут назад, EdgeAligned сказал:

    никакого волшебства

    Не понимаю почему знание шаблона стандартной библиотеки воспринимается как чудо. 

    31 минуту назад, EdgeAligned сказал:

    ВСЕГО ЛИШЬ

    Пользуйтесь, на здоровье. Сокращает писанину.

  7. 3 часа назад, EdgeAligned сказал:

    А что есть в вашем понимании "ясное и понятное"?

    Специализация if constexpr абсолютно однозначна и понятна. Желание специализировать методы иным способом вызывает, как минимум, недоумение. 

    3 часа назад, EdgeAligned сказал:

    std::size() - это всего лишь стандартный шаблон, появившийся в ++17. Это не свойство самого языка,

    Что-что? Стандартная библиотека это неотъемлемая часть языка.

    3 часа назад, EdgeAligned сказал:

    То есть, в целом, вы согласны

    Не надо за меня писать. Что я считаю и с чем согласен напишу сам. Спасибо.

    3 часа назад, artemkad сказал:

    А как по мне как раз тут возможно разночтение.

    Невозможно. Метод size() используется в разных контейнерах стандартной библиотеке и везде значит одно и то же.

    4 часа назад, EdgeAligned сказал:
    std::is_same<T2, int>::value

    std::is_same_v<T2, int>

  8. 52 минуты назад, EdgeAligned сказал:

    Если честно, жесть

    Вы всё вывернули наизнанку. Вместо специализаций, которые непонятно как сработают, ясное и понятное программирование. Это как раз шаг вперёд к понятности и надёжности кода.

  9. template<typename T1, int N>
    struct A 
    {
      void Foo()
      { 
        if constexpr(N==0) {} else {}  
      }	
    };

     

    7 часов назад, artemkad сказал:

    Че непонятно в "размер buf деленный на размер его нулевого элемента"? Это классика для начинающих.

    То ли дело в непонятном С++ это будет std::size(buf);

  10. 57 минут назад, Arlleex сказал:

    полагаю, максимум C++98, судя по году релиза бинарников

    -std=c++98 

    Впрочем, то что не собирается лучше исправить. Потому что на моей памяти из языка выпиливали только реальные эпик фэйлы.

    57 минут назад, Arlleex сказал:

    пытался от volatile избавиться

    С оптимизирующим компилятором в C/C++ это в принципе невозможно. Скорее это неправда.

     

    57 минут назад, Arlleex сказал:

    ведь в C++23 предупреждение исчезло

    А говорите от эмбеддеров отвернулись :)))

    57 минут назад, Arlleex сказал:

    Это в GCC или где?

    Это в GCC. Естественно с оптимизацией. У меня код без оптимизации не бывает в принципе. Метапрограммирование. 

    57 минут назад, Arlleex сказал:

    то это memcpy не тупой а хитрый

    Какой бы хитрый он не был, это вызов библиотечной функции вместо тупого цикла на месте.

  11. 23 минуты назад, Arlleex сказал:

    Ну и опять же, плюсы развиваются куда стремительнее по отношению к Си

    К сожалению, недостаточно быстро. Сами новшества по капле раз в три года, а компиляторы потом ещё догоняют годами. 

     

    23 минуты назад, Arlleex сказал:

    а самое главное, не всегда совместимо между версиями

    А вот это как раз неправда. Стремление к максимальной совместимости со старым кодом (для нас это конечно хорошо) является чуть ли не основным тормозом развития языка.

    23 минуты назад, Arlleex сказал:

    слишком много вариантов описания одного и того же

    Ничего удивительного, ведь у нас язык высокого уровня и мы пишем не инструкции процессора, а алгоритмы работы с данными. Более того, только с volatile данными! Алгоритмы можно по разному написать, это норм.

     

    23 минуты назад, Arlleex сказал:

    постепенно забивает на ембеддед

    Я бы не сказал. В языке всё больше компайлтайм вычислений. Всё больше контейнеров в стандартной библиотеки оптимизируют для работы без динамической памяти. Всё это только приближает к использованию в эмбедде.

    23 минуты назад, Arlleex сказал:

    например, я о составных присваиваниях |= над volatile переменными в C++20

    Это попытка убрать зависимые от компилятора реализации. Да, немного неудобно на старом коде в эмбедде, но мешает не сильно. Можно как переписать, так и подавить предупреждение. Понимание зачем это нужно есть.

     

    23 минуты назад, Arlleex сказал:

    Справедливости ради, NULL не обязательно должен иметь бинарное значение 0

    По хорошему, он вообще не должен иметь значения отображающегося на адресацию памяти. Как определить, вернулся NULL или это реальная память по адресу 0?

    21 минуту назад, Arlleex сказал:

    А Вы ожидали другого? Чего?

    Я ожидал компактного и оптимизированного цикла копирования 32-битными словами. Код с memcpy и memset получается больше и медленнее. Уж поверьте, проверено.

    Неочевидное добавление вот сюда volatile делает код меньше и быстрее.

    for(volatile uint32_t* pSrc = _sidata, *pDst = _sdata; pDst != _edata; *pDst++ = *pSrc++);

     

    21 минуту назад, Arlleex сказал:

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

    Именно так. Сидишь и как дурак ждешь три года эти нововведения чтобы применять можно было, когда хочется уже сейчас :)))

×
×
  • Создать...