С удивлением обнаружил, что про явление алиасинга (aliasing) здесь постов нет. Ситуацию нужно исправить, тк. алиасинг в любой сколько-то сложной C++ программе обязательно хоть где-нибудь, да есть. Это может быть хорошо, давая возможность ловких оптимизаций, а может быть плохо, внося повышенной паршивости баги. Под катом вкратце про оба случая (ну и неизменное «компилятор бьет спина», конечно; для разнообразия сегодня это gcc).
Пользователь
Городские легенды о медленных вызовах виртуальных функций
7 min
31KТрадиционно компиляторы реализуют вызовы виртуальных функций через двойную косвенную адресацию — если класс содержит хотя бы одну виртуальную функцию, то в начале каждого объекта этого класса хранится адрес таблицы виртуальных функций. Если компилятор не знает конкретный тип объекта, на который указывает указатель, то для вызова виртуальной функции нужно сначала взять указатель на объект, прочитать адрес начала таблицы, затем по номеру метода прочитать адрес, где хранится реализация функции, затем вызвать функцию.
Процесс поиска конкретной функции по указателю на объект называется поздним связыванием и выполняется во время работы программы. Позднее связывание не только увеличивает накладные расходы на вызов, но и препятствует оптимизации кода компилятором. Из-за этого сами виртуальные функции принято считать замедляющими работу.
В тексте выше ключевое слово «если». Что, если компилятор знает, какую функцию на самом деле надо вызывать?
Процесс поиска конкретной функции по указателю на объект называется поздним связыванием и выполняется во время работы программы. Позднее связывание не только увеличивает накладные расходы на вызов, но и препятствует оптимизации кода компилятором. Из-за этого сами виртуальные функции принято считать замедляющими работу.
В тексте выше ключевое слово «если». Что, если компилятор знает, какую функцию на самом деле надо вызывать?
+75
Краткий курс компьютерной графики: пишем упрощённый OpenGL своими руками, статья 3 из 6
6 min
94KTutorial
Содержание курса
- Статья 1: алгоритм Брезенхэма
- Статья 2: растеризация треугольника + отсечение задних граней
- Статья 3: Удаление невидимых поверхностей: z-буфер
- Статья 4: Необходимая геометрия: фестиваль матриц
- Статья 5: Пишем шейдеры под нашу библиотеку
- Статья 6: Чуть больше, чем просто шейдер: просчёт теней
Улучшение кода
Official translation (with a bit of polishing) is available here.
А что потом? Я разобрал весь материал!
В статьях 7 и 8 мы поговорим о программировании непосредственно под OpenGL. Есть ненулевая вероятность получить краткий курс OpenCL/CUDA в статьях 9+.
Удаление невидимых поверхностей
Знакомьтесь, это мой друг z-buffer головы абстрактного африканца. Он нам поможет убрать визуальные артефакты отбрасывания задних граней, которые у нас оставались в прошлой статье.
Кстати, не могу не упомянуть, что эта модель, которую я использую в хвост и в гриву, была любезно предоставлена замечательным Vidar Rapp.
Мы её можем использовать исключительно в рамках обучения рендерингу. Это очень качественная модель, с которой я варварски обошёлся, но я обещаю вернуть ей глаза!
+88
C++ в 2015-м году
3 min
38KTranslation
Год только начинается, так что давайте посмотрим, что язык С++ ожидает в 2015-м, как мы уже делали это в 2013-м и 2014-м.
Прошлый год принёс много изменений, главным из которых, безусловно, является стандарт С++14. Что важно, С++14 сегодня существует не только в виде стандарта, но и частично поддерживается GCC и Clang. Visual Studio также поддерживает некоторые (хотя и далеко не все) возможности С++14 и почти все (хотя опять таки не 100%) возможности С++11. Компилятор от Intel стал совместим с С++11 полностью. Таким образом, современные стандарты С++ доступны под все платформы — было бы только желание их использовать!
Прошлый год принёс много изменений, главным из которых, безусловно, является стандарт С++14. Что важно, С++14 сегодня существует не только в виде стандарта, но и частично поддерживается GCC и Clang. Visual Studio также поддерживает некоторые (хотя и далеко не все) возможности С++14 и почти все (хотя опять таки не 100%) возможности С++11. Компилятор от Intel стал совместим с С++11 полностью. Таким образом, современные стандарты С++ доступны под все платформы — было бы только желание их использовать!
+48
Именованные параметры C++. Не пригодились
5 min
30KВремя от времени вдруг начинает хотеться именованных параметров в C++. Не так давно была статья, да и сам какое-то время назад писал на эту тему. И вот что удивительно — со времен той своей статьи я участвую в новом проекте без необходимости тащить за собой старый код, и как-то удивительным образом всего этого описанного собой же не использую. Т.е. в вопросе разобрался, восхитился перспективами… и продолжил работать по-старинке! Как же так? Лень? Инерция? Ответ постараюсь дать под катом.
+52
Захват аналогового видеосигнала при помощи STM32F4-DISCOVERY
14 min
171KВ этой статье я расскажу о том, как можно захватывать аналоговый черно-белый видеосигнал с помощью платы STM32F4-DISCOVERY, и об особенностях передачи его на компьютер при помощи USB.
+68
BLE стек от TI. Разработка пользовательских приложений
5 min
39KTutorial
Привет, Хабр!
После написания предыдущего материала про BLE розетку я познакомился со многими
людьми, которыми интересна тема использования BLE в собственных разработках, но есть определенные
сложности в использовании С-программирования с BLE стеком для СС2541. Использование
внутреннего контроллера дает много преимуществ, в частности: прошивка по воздуху, экономия
на внешнем контроллере, сокращение числа точек пайки…
Я решил разбить материал на две части. Первая – это подготовка к работе, программирование и
отладка. Вторая – создание собственного BLE профиля.
После написания предыдущего материала про BLE розетку я познакомился со многими
людьми, которыми интересна тема использования BLE в собственных разработках, но есть определенные
сложности в использовании С-программирования с BLE стеком для СС2541. Использование
внутреннего контроллера дает много преимуществ, в частности: прошивка по воздуху, экономия
на внешнем контроллере, сокращение числа точек пайки…
Я решил разбить материал на две части. Первая – это подготовка к работе, программирование и
отладка. Вторая – создание собственного BLE профиля.
+9
Осваиваем CC430 — микроконтроллеры с радиомодулем: фотофиниш своими руками
4 min
25KСерия микроконтроллеров Texas Instruments CC430 — это MSP430 со встроенным радио модулем. В отечественных интернет-магазинах можно купить модули TE-CC430F51-433, содержащие на крошечной плате такой микроконтроллер с кварцем и кучкой других полезных деталей, по вполне демократичной цене. В этой статье я расскажу о построении на базе таких модулей фотофиниша — устройства весьма полезного для любителей спортивных состязаний. На нем естественно потенциальная сфера применения не ограничивается. Наличие 12 битного АЦП, аппаратного умножителя и другой периферии открывает широкий простор для применений, требующих передачи данных на расстояние до нескольких сотен метров.
+36
Lock-free структуры данных. Основы: Модель памяти
18 min
95KВ предыдущей статье мы заглянули внутрь процессора, пусть и гипотетического. Мы выяснили, что для корректного выполнения параллельного кода процессору необходимо подсказывать, до каких пределов ему разрешено проводить свои внутренние оптимизации чтения/записи. Эти подсказки – барьеры памяти. Барьеры памяти позволяют в той или иной мере упорядочить обращения к памяти (точнее, кэшу, — процессор взаимодействует с внешним миром только через кэш). “Тяжесть” такого упорядочения может быть разной, — каждая архитектура может предоставлять целый набор барьеров “на выбор”. Используя те или иные барьеры памяти, мы можем построить разные модели памяти — набор гарантий, которые будут выполняться для наших программ.
В этой статье мы рассмотрим модель памяти C++11.
+66
Атомарные и неатомарные операции
8 min
123KПеревод статьи Джефа Прешинга Atomic vs. Non-Atomic Operations. Оригинальная статья: http://preshing.com/20130618/atomic-vs-non-atomic-operations/
В Сети уже очень много написано об атомарных операциях, но в основном авторы рассматривают операции чтения-модификации-записи. Однако, существуют и другие атомарные операции, например, атомарные операции загрузки (load) и сохранения (store), которые не менее важны. В этой статье я сравню атомарные загрузки и сохранения с их неатомарными аналогами на уровне процессора и компилятора C/C++. По ходу статьи мы также разберемся с концепцией «состояния гонок» с точки зрения стандарта C++11.
+42
Микро БД для конфигурации на микроконтроллере
6 min
20KМногие разработчики программ для микроконтроллеров сталкивались с проблемой хранения конфигурационных данных. Это могут быть калибровочные коэффициенты измерительного алгоритма или просто последний выбранный пользователем пункт меню. Для микроконтроллера, имеющего возможность записывать в собственную flash-память, решение кажется простым — стираем сегмент и пишем туда все, что нужно. Однако, если необходимо еще и обеспечить отказоустойчивость по отношению к выключению питания в произвольный момент, задача становится нетривиальной, — по сути необходимо реализовать маленькую базу данных с механизмом обеспечения атомарности операций записи и восстановлением после сбоев. Решение этой задачи для микроконтроллеров семейства MSP430 — под катом. По количеству используемых ресурсов оно подходит даже для самых младших членов этого семейства — с размером RAM от 256 байт и falsh-памяти от 8Kb. В качестве бонуса — интерфейс командной строки (через UART) для чтения и записи конфигурации.
+24
Электронный тортик в кармане: дневник разработки
12 min
99KОколо года назад, когда я игрался с официальным Arduino Starter Kit, мне пришла в голову мысль сделать в подарок жене «схемотехнический тортик», а именно плату со светодиодами-свечками, которые можно задувать. Эта задача показалась мне хорошим учебным проектом для понимания того, как программировать микроконтроллеры и как воплощать программы в материю (ведь электроникой я стал увлекаться относительно недавно, а программировать начал еще в школе, поэтому ощущал огромный пробел в своем образовании).
Мне хотелось бы поделиться своим опытом разработки такого простого устройства с нуля, и заодно выложить его схему и программу, так что вы сможете воспроизвести его дома.
+57
network manager + автоматизация http-логина в wifi
2 min
17KПост будет коротким, но очень полезным.
abstract: Есть масса wifi-хот-спотов, которые просят сделать какую-нибудь глупость при подключении. Ввести пароль в http-форме, поставить чекбокс «согласен с продажей почки в обмен на интернет» и т. д.
Это задалбывает, особенно, если из wifi периодически выкидывает. В посте предлагается простое решение для автоматизации логина с помощью хуков Network Manager.
Нам надо понять куда кого как посылать, чтобы оно заработало. Ставим firebug или любой другой похожий плагин. Включаем, идём в вкладку 'net', включаем persistent (это важно), логинимся.
Получаем вот такое:
Находим POST (если их несколько — методом перебора и комбинирования), выбираем copy as curl, сохраняем куда-нибудь на будущее.
Дальше находим uuid нашего коннекта — в файле /etc/NetworkManager/system-connections/our_wifi.
Пишем скрипт (всё ниже — от рута) в каталоге /etc/NetworkManager/dispatcher.d/, например, /etc/NetworkManager/dispatcher.d/02-our_wifi-auto
abstract: Есть масса wifi-хот-спотов, которые просят сделать какую-нибудь глупость при подключении. Ввести пароль в http-форме, поставить чекбокс «согласен с продажей почки в обмен на интернет» и т. д.
Это задалбывает, особенно, если из wifi периодически выкидывает. В посте предлагается простое решение для автоматизации логина с помощью хуков Network Manager.
Подготовка
Нам надо понять куда кого как посылать, чтобы оно заработало. Ставим firebug или любой другой похожий плагин. Включаем, идём в вкладку 'net', включаем persistent (это важно), логинимся.
Получаем вот такое:
Находим POST (если их несколько — методом перебора и комбинирования), выбираем copy as curl, сохраняем куда-нибудь на будущее.
Дальше находим uuid нашего коннекта — в файле /etc/NetworkManager/system-connections/our_wifi.
Пишем скрипт (всё ниже — от рута) в каталоге /etc/NetworkManager/dispatcher.d/, например, /etc/NetworkManager/dispatcher.d/02-our_wifi-auto
+22
История о том, как мобильный оператор списал деньги с разработчика Dr. Tariff (захватите попкорн)
3 min
49KНа прошлой неделе мы решили рассказать читателям Хабра о том, как устроен профиль потребления абонента сотовой связью в России по агрегированным данным из Dr. Tariff (Google Play, App Store). Считали различные метрики, спорили о том, есть ли сезонность на рынке связи и как правильней считать эластичность спроса по цене. Вдруг завибрировал телефон…
+50
Идеальная передача и универсальные ссылки в C++
9 min
155KTranslation
Недавно на isocpp.org была опубликована ссылка на статью Eli Bendersky «Perfect forwarding and universal references in C++». В этой небольшой статье есть простой ответ на простой вопрос — для решения каких задач и как нужно использовать rvalue-ссылки.
+56
Что нового в работе с исключениями в C++11
8 min
42KВ интернете довольно много говорят о новых возможностях C++11: auto, lambda, variadic templates. Но как-то обошли стороной новые возможности работы с исключениями, которые предоставляет язык и стандартная библиотека.
От предыдущей версии стандарта остался механизм генерации исключений (throw), проверка того, что мы находимся в процессе обработки исключения (std::uncaught_exception), механизм остановки, если исключение не было обработано. Также есть иерархия стандартных исключений на базе класса std::exception.
Новый стандарт добавляет к этим вещам еще несколько сущностей, которые, на мой взгляд, могут существенно упростить работу с исключениями в C++.
От предыдущей версии стандарта остался механизм генерации исключений (throw), проверка того, что мы находимся в процессе обработки исключения (std::uncaught_exception), механизм остановки, если исключение не было обработано. Также есть иерархия стандартных исключений на базе класса std::exception.
Новый стандарт добавляет к этим вещам еще несколько сущностей, которые, на мой взгляд, могут существенно упростить работу с исключениями в C++.
+55
Гикпорн 5 или для чего вскрывают микросхемы
5 min
125KУгадал автора по названию? А вот и нет, в отличии от BarsMonster мы будем вскрывать микросхему не из спортивного интереса и даже не для того, чтобы посмотреть, как она работает. Мы будем искать почему она не работает. Иногда такое случается, особенно если технология изготовления кристаллов находится в стадии разработки и запускаемые проекты могут быть только экспериментальными. И подобная неприятность случилась у нас. В нашем случае полученные образцы оказались неработоспособными (выход годных близок к нулю). Исследование функционирования и электрических параметров указывали на технологические проблемы изготовления кристаллов, которые нам и предстоит обнаружить.
+116
Что нужно знать про арифметику с плавающей запятой
14 min
942KВ далекие времена, для IT-индустрии это 70-е годы прошлого века, ученые-математики (так раньше назывались программисты) сражались как Дон-Кихоты в неравном бою с компьютерами, которые тогда были размером с маленькие ветряные мельницы. Задачи ставились серьезные: поиск вражеских подлодок в океане по снимкам с орбиты, расчет баллистики ракет дальнего действия, и прочее. Для их решения компьютер должен оперировать действительными числами, которых, как известно, континуум, тогда как память конечна. Поэтому приходится отображать этот континуум на конечное множество нулей и единиц. В поисках компромисса между скоростью, размером и точностью представления ученые предложили числа с плавающей запятой (или плавающей точкой, если по-буржуйски).
Арифметика с плавающей запятой почему-то считается экзотической областью компьютерных наук, учитывая, что соответствующие типы данных присутствуют в каждом языке программирования. Я сам, если честно, никогда не придавал особого значения компьютерной арифметике, пока решая одну и ту же задачу на CPU и GPU получил разный результат. Оказалось, что в потайных углах этой области скрываются очень любопытные и странные явления: некоммутативность и неассоциативность арифметических операций, ноль со знаком, разность неравных чисел дает ноль, и прочее. Корни этого айсберга уходят глубоко в математику, а я под катом постараюсь обрисовать лишь то, что лежит на поверхности.
+239
Немного креатива — календарь с антипаттернами
3 min
28KВсем привет!
Пост повышенной несерьёзности, ибо пятница.
Хочу рассказать про антипаттерны, которые выкристаллизовались в нашей компании. Just For Fun.
Каждый раз, когда разработчики/монтажники/схемотехники применяли повторяющуюся отмазу, её фиксировали и заносили в список. Когда список вырос и в нём появилось почти 12 отмазок, нам пришла в голову идея сделать свой календарь с антипаттернами (поскольку отмазки иллюстрируют то, как не стоит думать и делать, приравниваем их к антипаттернам). Для этого нам предстояло осилить вёрстку календаря и к каждому анти-паттерну «родить» соответствующую картинку. Вёрстку делали в LaTex'е, а картинки — в inkscape, в svg-формате. В-общем, получилось вполне open-source'но. Но пост всё-таки больше не о технической реализации, а о самих анти-паттернах. Кому интересно, добро пожаловать.
Пост повышенной несерьёзности, ибо пятница.
Хочу рассказать про антипаттерны, которые выкристаллизовались в нашей компании. Just For Fun.
Каждый раз, когда разработчики/монтажники/схемотехники применяли повторяющуюся отмазу, её фиксировали и заносили в список. Когда список вырос и в нём появилось почти 12 отмазок, нам пришла в голову идея сделать свой календарь с антипаттернами (поскольку отмазки иллюстрируют то, как не стоит думать и делать, приравниваем их к антипаттернам). Для этого нам предстояло осилить вёрстку календаря и к каждому анти-паттерну «родить» соответствующую картинку. Вёрстку делали в LaTex'е, а картинки — в inkscape, в svg-формате. В-общем, получилось вполне open-source'но. Но пост всё-таки больше не о технической реализации, а о самих анти-паттернах. Кому интересно, добро пожаловать.
+20
Часы на ПЛИС (VHDL)
4 min
29KК этому проектированию меня подтолкнула доступность на каком-то этапе обучения к отладочной плате EP2C20F484C7 фирмы «Altera» (семейство «Cyclone-II»).
В ПЛИС заложены возможности, которые позволяют превратить ее в интегральную схему с любой функцией цифровой логики. Проектирование сводится к выявлению программируемых элементов (перемычек или запоминающих ячеек), после удаления которых в структуре схемы остаются только те связи, которые необходимы для выполнения требуемых функций. На практике эта задача весьма непростая, так как современные ПЛИС содержат в среднем несколько десятков тысяч перемычек. Поэтому для проектирования обязательно применяют системы автоматизированного проектирования (САПР ПЛИС).
В ПЛИС заложены возможности, которые позволяют превратить ее в интегральную схему с любой функцией цифровой логики. Проектирование сводится к выявлению программируемых элементов (перемычек или запоминающих ячеек), после удаления которых в структуре схемы остаются только те связи, которые необходимы для выполнения требуемых функций. На практике эта задача весьма непростая, так как современные ПЛИС содержат в среднем несколько десятков тысяч перемычек. Поэтому для проектирования обязательно применяют системы автоматизированного проектирования (САПР ПЛИС).
+7
Information
- Rating
- Does not participate
- Registered
- Activity