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

C *

Типизированный язык программирования

Сначала показывать
Порог рейтинга
Уровень сложности

Об одном методе распределения памяти

Время на прочтение17 мин
Количество просмотров29K
image
Не секрет, что иногда выделение памяти требует отдельных решений. Например — когда память выделяется и освобождается стремительным домкратом потоком, в параллельных задачах.

В результате стандартный консервативный аллокатор выстраивает все запросы в очередь на pthread_mutex / critical section. И наш многоядерный процессор медленно и печально едет на первой передаче.

И что с этим делать? Познакомимся поближе с деталями реализации метода Scalable Lock-Free Dynamic Memory Allocation. Maged M. Michael. IBM Thomas J. Watson Research Center.

Самый простой код что я сумел найти — написан под LGPL камрадами Scott Schneider и Christos Antonopoulos. Его и рассмотрим.

Читать дальше →

Особенности работы со временем в различных временных зонах

Время на прочтение8 мин
Количество просмотров26K
В связи с тем, что накопилось несколько вопросов и решений по работе со временем, решил сделать небольшой обзор.

Читать дальше →

Как заставить компилятор C/C++ генерировать плохой код

Время на прочтение4 мин
Количество просмотров37K
Это перевод статьи «How to trick C/C++ compilers into generating terrible code?», автор оригинала — Aater Suleman.

На курсе архитектуры ЭВМ мне сказали, что процессор похож на машину. Руль и педали — это ISA, двигатель — микроархитектура, а программа — водитель. Продолжая эту аналогию, скажу, что использование компьютера похоже на управление машиной через пульт дистанционного управления. Пульт — это клёвая вещь, но в то же время важно понимать, как он работает. Даже в профессиональном ПО я видел много примеров кода, который может смутить даже самый умный компилятор. В этой статье я расскажу об основных методах запутывания компиляторов.

Читать дальше →

Оптимальные опции для x86 GCC

Время на прочтение4 мин
Количество просмотров57K
      Распространено мнение, что GCC отстает по производительности от других компиляторов. В этой статье мы постараемся разобраться, какие базовые оптимизации GCC компилятора стоит применить для достижения приемлемой производительности.

Читать дальше →

Как malloc память ест

Время на прочтение3 мин
Количество просмотров72K
Нет, здесь не будет ничего из серии «Аааа, я сделал malloc (new), и забыл сделать free (delete)!»
Здесь будет нечто изощренное: мы будем отрезать кусочки памяти по чуть-чуть, прятать их в укромное место… А когда операционная система заплатит выкуп скажет «Хватит!», мы попробуем вернуть все обратно. Казалось бы, простейшая операция выделения и освобождения памяти — ничего не предвещает беды.
Тем кому интересно как уничтожить забить память — прошу под хабракат
Взять в руки компилятор

Вся правда о целочисленных типах в C

Время на прочтение3 мин
Количество просмотров142K
Для начала несколько вопросов:

  1. Тип char по умолчанию знаковый или нет? А int?
  2. Законно ли неявное приведение (signed char *) к (char *)? А то же для int?
  3. Сколько бит в unsigned char?
  4. Какое максимальное число гарантированно можно поместить в int? А минимальное?
  5. Тип long определённо больше, чем char, не так ли?

Разумеется, экспериментально искать ответы на эти вопросы с помощью вашего любимого компилятора в вашей любимой системе на вашем любимом компьютере1) — не лучшая идея. Мы говорим о стандарте языка (С99 и новее).

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

Предположу, что вы ответили
  1. Знаковые оба.
  2. Законны оба.
  3. 8.
  4. 2147483647. -2147483648.
  5. Конечно, Кэп.


А правильные ответы такие
  1. char — не регламентируется, int — знаковый.
  2. Для int — законно, а для char — нет.
  3. Не менее 8.
  4. 32767. -32767
  5. Вообще говоря, нет.



Читать дальше →

Итоги 21-го конкурса IOCCC

Время на прочтение4 мин
Количество просмотров23K
Объявлены победители 21-го международного конкурса обфусцированного кода на C. Как обычно, участники удивили способностью втиснуть совершенно невероятные вещи в программы до 4096 байт. Чтобы получить максимальное удовольствие, организаторы конкурса рекомендуют смотреть версию без спойлеров и пытаться понять по коду программы, что она делает.

Например, что делает такая программа?
             main(l
        ,a,n,d)char**a;{
    for(d=atoi(a[1])/10*80-
   atoi(a[2])/5-596;n="@NKA\
  CLCCGZAAQBEAADAFaISADJABBA^\
  SNLGAQABDAXIMBAACTBATAHDBAN\
  ZcEMMCCCCAAhEIJFAEAAABAfHJE\
  TBdFLDAANEfDNBPHdBcBBBEA_AL\
   H E L L O,    W O R L D! "
     [l++-3];)for(;n-->64;)
        putchar(!d+++33^
             l&1);}

Ответ
Правильно, печатает карту мира.



И не просто печатает, но ещё отмечает на карте место (символ " или # с координатами, которые можно указать при запуске).
Кстати, это «лучшая маленькая программа» на IOCCC 1992 года.

Другие спойлеры

ELF — приложение на телефоне LG?

Время на прочтение7 мин
Количество просмотров17K

Первоначальное мнение


Я всегда думал, что телефоны от компании LG для «домохозяек». И когда мне попал в руки аппарат LG KP500 я своё мнение особо не изменил, хотя в нём было много чего весьма интересного. Я имею ввиду это диспетчер задач (даже есть специальная кнопка), который может вызывать и закрывать другие свёрнутые родные и Java — приложения, в Java доступна работа с файловой системой (JSR — 75), хоть и не полностью, на этом функционал Java — машины заканчивается. В этом телефоне (это я подчёркиваю, он позиционируется как «звонилка») даже есть свой формат исполнительных файлов — PXE (*.pxo), но правда он скрыт для пользователя и запускается из конкретной папки диска, имеющий атрибут только чтение. Данный аппарат имеет неплохое «железо». Это Nand Flash 256 Мб / SDRAM 128 Мб, TFT сенсорный резистивный дисплей c разрешением 400x240 и 262 тысяч цветов, 3-х осевой акселерометр и бейзбенд-процессор Infineon SGold-3 (PMB8877), ну и стандартный набор: камера, BlueTooth, радио и т.д. Операционной системы такой как Android, Windows, iOS — там нет, зато есть свой закрытый «велосипед» на ядре Nucleus RTOS древней версии. Такое «железо», на мой взгляд, к подпольным «эльфописателям» не попадалось, что даёт определённый стимул.
Читать дальше →

Шаблоны на C. Да! На чистом С. Не С++

Время на прочтение4 мин
Количество просмотров66K

Зачем?


Давайте представим себе, что нам нужно написать набор функций, которые отличаются друг от друга лишь парой ключевых слов (и, как правило, одно из них — название типа). Ну, вот, например, взгляните на функции, рассчитывающие суммы элементов массивов для разных типов
Читать дальше →

Во всём виноват компилятор

Время на прочтение2 мин
Количество просмотров38K
Многие программисты очень любят обвинять компилятор в различных ошибках. Поговорим немного об этом.
Читать дальше →

Ускорение в 3,7 раза после удаления Sleep() в WebKit

Время на прочтение1 мин
Количество просмотров4.5K
Джофф Гарен (Geoff Garen) из компании Apple обнаружил вызов Sleep() в спинлоке функции TCMalloc сборщика мусора WebKit.

 -#if OS(WINDOWS)
-    Sleep(2);
-#else
-    struct timespec tm;
-    tm.tv_sec = 0;
-    tm.tv_nsec = 2000001;
-    nanosleep(&tm, NULL);
-#endif

После удаления Sleep производительность сборщика в определённых условиях выросла в 3,7 раза. Это наглядный пример, как одна маленькая оптимизация способна в несколько раз повысить производительность.
Читать дальше →

Максимально точное измерение кода

Время на прочтение6 мин
Количество просмотров27K

В моей статье полугодичной давности о длинной арифметике есть замеры скорости (throughput в тактах) очень коротких фрагментов кода — всего по несколько инструкций. Методика измерения была кривовата, но давала правдоподобные результаты. Потом выяснилось, что результаты таки неверные — поверхностный подход всегда сказывается.

В этом посте я опишу надежный метод «нанобенчмаркинга» с минимальной погрешностью и без подключения специальных библиотек и драйверов, к которому в итоге пришел. Применимость: сравнение однопоточного потенциала процессоров, просто интерес.
Читать дальше →

Маленькая C-функция из преисподней

Время на прочтение5 мин
Количество просмотров3.6K
Недавно мой студент и я пытались понять одну тонкость в стандарте C. Самый простой способ прояснить подобные вопросы — это узнать, учли ли её разработчики компиляторов, то есть написать код и посмотреть, что с ним будут делать разные компиляторы.

Я написал такую функцию:
int foo (char x) {
  char y = x;
  return ++x > y;
}

Так как ++x увеличивает на 1 значение x, очевидно, что функция должна возвращать "1" для большинства значений x. Вопрос состоит в том, что она вернет для значения CHAR_MAX?

Читать дальше →

Ближайшие события

Подсчет ссылок атомарными переменными в C/C++ и GCC

Время на прочтение7 мин
Количество просмотров7.2K
Автор: Alexander Sandler, оригинал статьи (27 мая 2009)

Введение


Допустим, у нас есть структура данных, которая управляет объектами и мы хотели бы работать с ней и объектами из двух или более потоков. Для достижения максимальной производительности мы должны различать механизм, использующийся для защиты самой структуры данных и механизм, использующийся для защиты актуальных объектов.
Читать дальше →

Мы не написали книгу! Практический опыт создания учебного пособия по программированию

Время на прочтение3 мин
Количество просмотров3.4K
Идею написать эту заметку подарила статья «Мы написали книгу! Практический опыт издания книги о программировании». Как и тот автор, я начала писать в начале года и закончила к середине апреля, работала примерно в том же объеме. Но произведение немного иного толка — учебное пособие по языку программирования C.

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

Потребность в таком пособии назрела к началу декабря прошедшего учебного года. Декабрь ушел на просмотр существующей литературы и пособий по языку C. Не смотря на то, что среди просмотренного были достойные произведения, ни одно из них не подходило. Например, известное издание K&R, которое часто рекомендуют, не подходит для начинающих. Другие издания либо были объемны, либо не давали объективных знаний. Мне же нужно было пособие, рассчитанное не более чем на 30 пар (60 академ.часов).
Читать дальше →

С11 исправит ошибки С99

Время на прочтение2 мин
Количество просмотров8.4K
В декабре 2011 года был утверждён стандарт ISO/IEC 9899:2011, он же C11 или C1X, новый стандарт для языка программирования C.

Дэнни Калев (Danny Kalev), бывший член комитета стандартизации C++, вкратце объясняет, в чём суть главных нововведений в C11: новая модель памяти для лучшей поддержки многопоточности, анонимные структуры и объединения и многие другие функции, которые уже присутствуют в C++.

Некоторые обязательные функции C99 становятся опциональными в C11 (массивы переменной длины, комплексный тип данных и др.), но добавляются некоторые функции C++. Комитеты C и C++ плотно сотрудничали, чтобы обеспечить максимальную совместимость языков.
Читать дальше →

Как решить проблему 10 000 соединений?

Время на прочтение1 мин
Количество просмотров28K


Способы решения этой проблемы, поднятой еще в 2001 году программистом Дэном Кегелем, рассматриваются в девятой лекции курса «Сетевое программирование в UNIX», подготовленного специалистами SkyDNS и компании «Айдеко». За подробностями – добро пожаловать под кат.
Читать дальше →

Реализация разделяемой памяти между драйвером и приложением

Время на прочтение6 мин
Количество просмотров10K

Приветствую всех!
В этой небольшой статье речь пойдет об одном способе создания разделяемой памяти, к которой можно будет обращаться как из режима ядра, так и из пользовательского режима. Приведу примеры функций выделения и освобождения памяти, а также будут ссылки на исходники, чтобы можно было попробовать любому желающему.

Читать дальше →

Многозадачность в микроконтроллерах на основе продолжений

Время на прочтение8 мин
Количество просмотров27K
Программисты C и так не избалованы возможностями языка, а разработчики встроенных систем на микроконтроллерах ограничены еще больше, зачастую их программы работают на голом железе, без поддержки ОС.
Возможность использования в С сопрограмм, генераторов, кооперативной многозадачности часто может сильно упростить программу и сэкономить силы, но эти возможности языка не очевидны и многие про них не знают.
Продолжения (contionuation) позволяют запомнить состояние выполнения программного потока (функции), и вернуться к этому месту в дальнейшем.
Используя продолжения, мы можем получить сопрограммы (coroutine), а это уже практически готовые генераторы, итераторы и кооперативная многозадачность.
Читать дальше →

Итоги 20-го международного конкурса непонятного кода на C

Время на прочтение2 мин
Количество просмотров16K
Организаторы IOCCC (Международный конкурс на самый непонятный код C) нажали кнопку «турбо». Если результаты прошлого конкурса опубликовали спустя четыре года после проведения, теперь прошло всего два месяца — и вот они.

Участвовать в конкурсе могут готовые программы размером меньше 4096 байт, при этом количество значимых символов, без учёта пробелов, знаков табуляции и знаков ; ( ), не должно превышать 2048. Задачей конкурса является «проверять компиляторы на стресс, демонстрировать тонкости языка программирования Си и важность соблюдения стиля программирования (делая обратное)».
Читать дальше →

Вклад авторов