clang

  • ХабрахабрФото BPF для самых маленьких, часть первая: extended BPF

    BPF для самых маленьких, часть первая: extended BPF

    В начале была технология и называлась она BPF. Мы посмотрели на нее в предыдущей, ветхозаветной, статье этого цикла. В 2013 году усилиями Алексея Старовойтова (Alexei Starovoitov) и Даниэля Боркмана (Daniel Borkman) была разработана и включена в ядро Linux ее усовершенствованная версия, оптимизированная под современные 64-битные машины. Эта новая технология недолгое время носила название Internal BPF, затем была переименована в Extended…

    Читать далее »
  • ХабрахабрФото Как можно и как нельзя использовать нулевой указатель в С++

    Как можно и как нельзя использовать нулевой указатель в С++

    Некоторым этот банальный вопрос уже набил оскомину, но мы взяли 7 примеров и попытались объяснить их поведение при помощи стандарта: struct A { int data_mem; void non_static_mem_fn() {} static void static_mem_fn() {}}; void foo(int) {} A* p{nullptr}; /*1*/ *p;/*2*/ foo((*p, 5)); /*3*/ A a{*p};/*4*/ p->data_mem;/*5*/ int b{p->data_mem};/*6*/ p->non_static_mem_fn();/*7*/ p->static_mem_fn(); Очевидная, но важная деталь: p, инициализированный нулевым указателем, не может указывать…

    Читать далее »
  • ХабрахабрФото Указатели на методы классов в C++

    Указатели на методы классов в C++

    Привет, интернет. Решил написать статью об указателях на методы классов. Недавно мне пришлось столкнуться с тем, как они работают изнутри, когда писал некоторые вещи ориентированные под компилятор. Эти указатели работают не совсем как обычные указатели, не имеют возможности быть приведенными в void, и часто имеют размер больше 8 байт. Информации на эту тему в интернете я нашел относительно немного, потому…

    Читать далее »
  • ХабрахабрФото Атрибут cleanup

    Атрибут cleanup

    Цитата из документации GCC [1]:Атрибут cleanup предназначен для запуска функции, когда переменная выходит из области видимости. Этот атрибут может быть применён только к auto-переменным, и не может быть использован с параметрами или с static-переменными. Функция должна принимать один параметр, указатель на тип, совместимый с переменной. Возвращаемое значение функции, если оно есть, игнорируется. Если включена опция -fexceptions, то функция cleanup_function запускается…

    Читать далее »
  • ХабрахабрФото Помоги компилятору помочь тебе

    Помоги компилятору помочь тебе

    Предисловие Современные компиляторы обладают огромным количеством диагностик. И удивительно, что очень малая их часть включена по умолчанию. Огромное количество претензий, которые предъявляют к языку C++ в этих ваших интернетах, — про сложность, небезопасность, стрельбу по ногам и т.п., — относятся как раз к тем случаям, когда люди просто не знают о том, что можно решить эти проблемы лёгким движением пальцев…

    Читать далее »
  • ХабрахабрФото Сравнивали Haskell и C++, а сравнили jump и cmov

    Сравнивали Haskell и C++, а сравнили jump и cmov

    В статье [ссылка] было заявлено, что производительность Haskell кода превзошла код на С++. Что сразу вызвало интерес, т.к. и то и другое может генерироваться LLVM компилятором, значит либо Наskell может давать больше хинтов компилятору, либо что-то не так с С++ реализацией. Далее мы разберём, как череда случайностей в действиях автора привела к неправильным выводам, которые описываются таблицей ниже (под катом).…

    Читать далее »
  • ХабрахабрФото [Из песочницы] О некоторых проблемах микрооптимизаций

    [Из песочницы] О некоторых проблемах микрооптимизаций

    Предыстория Как-то раз у меня с коллегой завязался разговор по поводу улучшения инструментария для работы с битовыми флагами в перечислениях C++. На тот момент у нас уже была функция IsEnumFlagSet, принимающая на вход первым аргументом тестируемую переменную, вторым — набор флагов для проверки. Чем же она лучше старого доброго побитового И? if (IsEnumFlagSet(state, flag)) // vs if (state & flag)…

    Читать далее »
  • ХабрахабрФото [Перевод] Clang-format тормозит работу программы

    [Перевод] Clang-format тормозит работу программы

    Сегодня мы будем измерять производительность разных реализаций функции toupper, ведь именно этим и занимаются по вторникам. Я старался выбрать что-то максимально простое, что не увело бы меня в сторону, но так уж получилось, что в этом тесте я столкнулся со странной проблемой.Этот пост будет небольшим – более обстоятельная статья на первоначальную, возможно более интересную тему ожидается в скором времени. Вообще-то…

    Читать далее »
  • ХабрахабрФото [Перевод] Как LLVM оптимизирует функцию

    [Перевод] Как LLVM оптимизирует функцию

    Оптимизирующий AOT-компилятор обычно структурирован так: фронтенд, преобразующий исходный код в промежуточное представление конвейер машинно-независимой оптимизации (IR): последовательность проходов, которые переписывают IR для устранения неэффективных участков и структур, которые не могут быть непосредственно преобразованы в машинный код. Иногда эту часть называют middle-end. Машинно-зависимый бэкенд для генерации ассемблерного кода или машинного кода. В LLVM формат и семантика фиксированы, и, следовательно, возможно запускать…

    Читать далее »
  • ХабрахабрФото [Перевод] Инкремент элементов вектора

    [Перевод] Инкремент элементов вектора

    В каком случае инкремент элементов вектора std::vector будет быстрее – если они имеют тип uint8_t или uint32_t? Чтобы не рассуждать отвлечённо, рассмотрим две конкретные реализации: void vector8_inc(std::vector<uint8_t>& v) } void vector32_inc(std::vector<uint32_t>& v) { for (size_t i = 0; i < v.size(); i++) { v[i]++; } } Попробуем угадать На этот вопрос легко ответить, используя бенчмарк, и чуть позже мы так…

    Читать далее »


Кнопка «Наверх»