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

Для подтверждения своих слов я изучаю и цитирую авторитетные источники, рекомендуемые в подборках книг, материалах конференций и курсах по C и C++.

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

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

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

Рассмотрим «простой» пример цикла, выполняющего сложение двух массивов:

for (int i = 0; i < numItems; i++)
{
    c[i]= a[i] + b[i];
}

Слово «простой» взято в кавычки не случайно. Даже тезисное обсуждение эффективных методов сложения массивов на GPU (NVIDIA или AMD) с коллегами занимает несколько часов. Полноценно раскрыть эту тему в одной статье невозможно.

Поэтому сосредоточимся лишь на части примера – операции инкремента «i++» в управляющей части цикла.

Для анализа обратимся к книгам, рекомендованным на профильных it-ресурсах (Хабр, Яндекс.Практикум, Proglib и др.) [1, 2, 3], а также к подборке, составленной с помощью нейросети [4].

Среди анализируемых источников будет книга «Программирование. Принципы и практика использования C++» Бьерна Страуструпа 2024 года [5], популярный учебник по «C++ для начинающих. 2-е издание» Герберта Шилдта 2026 года [6], а также издания Стивена Прата [8, 9] и Скотта Мейерса [10, 11].

Для анализа материалов по вычислительным устройствам мы рассмотрим официальные руководства следующих производителей: CISC (Intel, AMD), VLIW (МЦСТ, Texas Instruments), RISC (Apple, Qualcomm, MediaTek и др.) и GPU (NVIDIA, AMD). 

1.  Анализ учебников по программированию

Давайте начнём анализ вопроса, обратившись к учебникам по C и C++.

Герберт Шилдт, известный автор книг по программированию на C, C++, C# и Java, в книге «C++ для начинающих. 2-е изд.» 2026 года [6] пишет, что лучше использовать операцию инкремента count++ вместо сложения count = count + 1, т. к. она выполняется эффективнее.

Аналогичное утверждение описано в книге «C++: базовый курс. 3-е изд.» 2021 года [7] – используя инкремент, компиляторы создают более быстрый и эффективный код.

Стивен Прата, автор книг по C и C++ [8, 9], также считает, что инкремент более эффективен. Он пишет, что инкре��ент преобразуется в аналогичные машинные команды, которые выполняются быстрее сложения. Кроме того, современные компиляторы могут находить выражения вида a = a + 1 и заменять их на инкремент.

Удивительно, но в этих книгах нет ссылок на сайты производителей вычислительных устройств, разработчиков компиляторов или исследований, подтверждающих эту информацию. Чтобы операция i++ выполнилась быстрее, чем i = i + 1, компилятор должен заменить её на более эффективный машинный код. А производитель «железа» должен реализовать процессор так, чтобы этот машинный код выполнялся быстрее, чем операция сложения.

Дополнительно Стивен Прата [8, 9] и Скотт Мейерс [10, 11] обращают внимание на то, что написание инкремента в префиксной (++a) и постфиксной (a++) формах может значительно влиять на производительность. Программисту важно проверять, как они компилируются в машинный код, особенно для пользовательских типов. Для наглядности автор приводит пример, показывающий различия в работе обеих форм:

// префиксная форма ++a
UPInt& UPInt::operator++()
{
*this += 1;
return *this;
}

// постфиксная форма a++
const UPInt UPInt::operator++(int)
{
const UPInt oldValue = *this;
++(*this);
return oldValue;
}

Код показывает, что при использовании постфиксной формы требуется выполнить больше операций, что значительно снижает производительность. Однако в тексте не указано, о каких вычислительных платформах или компиляторах идёт речь.

Бьёрн Страуструп, создатель C++, в книге «Программирование. Принципы и практика использования C++» 2024 года пишет, что вопреки распространённому мнению об эффективности инкремента, современные компиляторы часто генерируют одинаковый код для ++a (a++) и a = a + 1. Поэтому для повышения читаемости лучше использовать сокращённую форму увеличения счетчика цикла.

В книге отсутствуют ссылки на материалы производителей железа или разработчиков компиляторов. Раздел с библиографией в основном включает труды автора. В разделе с полезными для прочтения материалами указано 13 источников, из них 8 – это книги по C++ самого автора, ещё 2 из оставшихся – издания 1978 и 1979 годов.

Анализ стандарта ISO/IEC 14882 [12] и других источников [4, 13, 14, 15], показал, что они либо не содержат информации об инкременте, либо придерживаются описанных выше подходов.

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

Даже Бьёрн Страуструп, как самый авторитетный источник, грамотно подстраховывается, и, выражая свои мысли, не делает однозначных утверждений. Он ясно дает понять, что это лишь его мнение, которое касается не оптимизации, а скорее написания более понятного кода.

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

2. Анализ руководств производителей «железа»

2.1 CISC-архитектура

Intel

Начнём с процессоров архитектуры x86-64 – одной из самых популярных платформ для разработки и запуска десктопных и серверных приложений.

Рассмотрим руководство по оптимизации кода для разработчиков компиляторов и приложений «Intel 64 and IA-32 Architectures Optimization Reference Manual: Volume 1» 2024 года [16]. В разделе по общей оптимизации операционной части ядра (3.5 Optimizing the execution core) советуют избегать команд, частично изменяющих регистр флагов. Такие команды создают ложные зависимости от предыдущих команд, замедляя выполнение кода. В более ранних версиях руководства это правило в первую очередь касалось команд инкремента и декремента (INC и DEC), которые рекомендовалось заменять на сложение и вычитание (ADD и SUB).

В подразделе оптимизации объединения команд (3.4.2.2 Optimizing for macrofusion) указано, что лучше использовать те, которые ядро может объединить в одну. Это ускоряет выполнение кода без перекомпиляции. При этом команды сложения и вычитания поддерживают объединение с 20 другими, а инкремент и декремент – только с 12. Таким образом, использование сложения и вычитания повышает потенциал оптимизации.

Во втором томе руководства даны дополнительные рекомендации, показатели задержки и пропускной способности для различных архитектур CPU и сопроцессоров.

Например, в разделе «Особенности выполнения целочисленных команд» (5.4 Integer execution considerations) для процессоров с архитектурой Knights указано, что команды INC и DEC требуют двух операций. Они декодируются как одна, но в операционном устройстве выполняются как две. Поэтому их нужно заменять на «ADD reg, 1» и «SUB reg, 1».

Перейдём к разделу с задержками и пропускной способностью команд (7.3 Latency and throughput). Для CPU с 2012 по 2015 года (архитектуры Skylake, Broadwell, Haswell, Ivy Bridge) команда сложения выполняется за один такт, а инкремент – за два на всех CPU, кроме архитектуры Skylake. В Intel Atom (Silvermont, Airmont, Goldmont) процессор может запустить на выполнение всего одну команду инкремента, а сложения – две или три за такт.

Современные гибридные архитектуры процессоров [14] включают энергоэффективные ядра (архитектура Gracemont), которые могут запустить (выполнить) четыре команды сложения за такт, против двух – инкремента. В то же время производительные ядра одинаково эффективно справляются с обоими типами команд.

Также стоит напомнить, что для оптимизации циклов в x86-64 есть команда loop, которая автоматически вычитает единицу из регистра счётчика CX. Если значение счётчика не равно нулю, то выполняется возврат на заданную метку, иначе выполняется следующая по порядку команда после цикла. Эта команда устарела. В руководстве Intel по оптимизации кода за 2014 год указано, что она выполняется за 8 тактов. Кроме того, процессору требуется больше одного такта, чтобы запустить её выполнение. Поэтому она исключена из актуальных руководств или в них указано, что она реализуется с помощью других команд.

Анализ руководств Intel показывает, что рекомендация использовать инкремент вместо сложения для повышения производительности уже несколько десятилетий не актуальна. Только если возвращаться на полвека назад, к руководствам 1979 года [19], то можно найти информацию, что в процессорах 8086 инкремент выполняется за два такта, а сложение – за три. Однако в руководствах 1986 года по процессору 80386 [20] сложение и инкремент уже выполняются за 2 такта.

AMD

Анализируя документацию процессоров x86-64, нельзя не упомянуть компанию AMD. В отличие от Intel, у AMD не наблюдается такого разнообразия в реализации команд, с помощью которых можно увеличить счётчик циклов.

Как в новых руководствах по архитектуре «AMD64 Architecture Programmer’s Manual» 2024 года [21], так и в старых, таких как «Software Optimization Guide for AMD Family 17h Processors» 2021 [22] или 2012 годов, указано, что команды инкремента и сложения выполняются за одинаковое количество тактов. 

2.2 VLIW-архитектура

МЦСТ

Процессоры МЦСТ «Эльбрус» – ещё одна вычислительная платформа, о которой очень часто говорят, в связи с импортозамещением.

К сожалению, на официальном сайте не удалось найти актуальное описание ISA для этой платформы. Однако на нём есть «Руководство по эффективному программированию на платформе Эльбрус» 2024 года [23], где в разделе 2.2.5 «Циклы» говорится, что компилятор по‑разному обрабатывает счётчики циклов в зависимости от параметров оптимизации. При компиляции кода с параметром оптимизации -O0 используется сложение, а с -O3 –  специальная команда ALC продвижения счетчика цикла (advance loop counter).

Архитектура процессора «Эльбрус» – VLIW (Very Long Instruction Word – с очень широкими командами) значительно отличается от CISC и RISC. Для таких процессоров одна команда может содержать множество параллельных операций. Поэтому отдельные операции сложения или инкремента неэффективны.

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

Для процессоров «Эльбрус» нет смысла вручную менять команды инкремента на сложение или наоборот. Лучше использовать опции компилятора и проверять, что управляющая часть цикла выполняется параллельно вместе с другими операциями. 

Texas Instruments

Компания Texas Instruments также производит VLIW-процессоры C29 CPU [24]. В документе «The C29 CPU – Unrivaled Real-Time Performance with Optimized Architecture on C2000 MCUs» [25] счётчик циклов в примерах изменяется командой декремента.

Рекомендации аналогичны процессору «Эльбрус» – использовать параметр оптимизации «-O3», при  котором компилятор частично «разворачивает» циклы и упаковывает управляющую часть цикла и его тело в одну широкую команду [25]. 

2.3 RISC-архитектура

Apple

Ещё одна аппаратная платформа, которая у всех на слуху – это процессоры компании  Apple, которые представляют пример современной RISC‑архитектуры.

В руководстве по оптимизации кода для CPU семейств A (A14/15/16 Bionic, A17 Pro, A18) и Mx (M1, M2, M3, M4) «Apple Silicon CPU Optimization Guide» 2025 года [26] указано, что в системе команд нет отдельной команды инкремента, как в Intel (x86-64). Но есть команда CINC/CSINC (Conditional Increment ­– условный инкремент), которая увеличивает счётчик, если выполняется условие, иначе счётчик не меняется.

В разделе по оптимизации условных переходов (5.4.5 Conditional Branch Mispredicts and Conditional Instructions) рекомендуется использовать CINC, когда вероятность обеих веток кода одинакова. Например, если мы в теле цикла считаем число пар a[i] и b[i], для которых выполняется условие: if (a[i] > b[i]) { count++; }. Однако для счётчика циклов она не подходит, так как вероятность повторения тела цикла выше, чем выхода из него. В таких случаях эффективнее использовать команду сложения.

В разделе по оптимизации объединения команд (2.11 Fused Op with Add/Accumulate Operations (Integer Unit)) как и у Intel указано, что предпочтительнее использовать команды сложения, которые могут объединяться с другими для уменьшения размера кода и повышения производительности.

В разделе, посвящённом оптимизации операций с векторами и матрицами (Chapter 4. ISA Optimization: Scalable Matrix Extension (SME)), указано, что для операций i++ и j-- используются команды сложения и вычитания, которые неэффективно работают с векторами. Для оптимизации таких кейсов необходимо использовать специальные скалярные команды INC<size>, DEC<size>, CNT<size>, CTERM<EQ/NE>, позволяющие увеличивать счётчик с учётом размера вектора и выходить из цикла по условию или когда вектор закончился. Они выполняются за три такта, в то время как обычные команды сложения – за один такт. Поэтому важно оценивать сценарии выполнения кода.

Анализ документации Apple показывает, что последние семейства процессоров могут использовать для оптимизации кода как команду сложения, так и инкремента. Оба подхода могут использоваться для оптимизации различных сценариев работы приложений: ADD предпочтительно для счётчиков циклов, CINC эффективен при равновероятных условных ветках, специальные команды (INC<size>, DEC<size> и др.) – для оптимизации векторных операций.

Qualcomm, MediaTek

Архитектура ARM – ещё одна из наиболее распространённых RISC‑платформ, конкурирующая по охвату с x86-64. Мы частично упоминали её, когда говорили о процессорах Apple. Эти процессоры совместимы с архитектурой Armv9 и ссылаются на официальную документацию ARM при описании ISA.

Процессоры Qualcomm и MediaTek, используемые в большинстве современных смартфонов и планшетов, построены на архитектуре Armv8 и Armv9. Arm определяет три профиля архитектуры: A-профиль (Application profile) – профиль приложений, R-профиль (Real-time profile) – профиль реального времени, M-профиль (Microcontroller profile) – профиль для микроконтроллеров. Нас в первую очередь интересует первый профиль.

В официальном мануале по архитектуре CPU A-профиля «Arm Architecture Reference Manual for A-profile architecture» [27] 2024 года, как и в мануале Apple нет отдельной команды инкремента. Однако есть условный инкремент (CINC/CSINC) и отдельные команды инкремента и декремента для оптимизации векторных операций.

Рекомендации для процессоров Qualcomm и MediaTek схожи с теми, что мы давали для процессоров Apple.

Прочие производители

Помимо уже рассмотренных, в разделе с описанием RISC-архитектуры нельзя не упомянуть такие компании, как IBM, Sparc, Analog Devices, STMicroelectronics, Texas Instruments и Микрон.

В документации п�� ISA процессоров IBM с архитектурой POWER – «OpenPOWER Foundation Power Instruction Set Architecture» 2024 года [28] в системе команд нет инкремента. Во всех примерах вместо инкремента используется добавление единицы к содержимому регистра.

В мануалах по процессорам Sparc, построенным на RISC-архитектурах OpenSPARC [29] или SPARC-V9 [30], также нет отдельной команды инкремента. Есть синтетическая команда «INC», которая фактически выполняется через сложение.

Компания Analog Devices выпускает контроллеры, которые включают сразу два процессора на разных архитектурах: ARM и RISC-V [31, 32]. Ранее мы уже рассматривали ARM. В руководстве по набору команд «The RISC-V Instruction Set Manual» 2025 года [33] нет отдельной команды инкремента. Для управления циклом во всех примерах используются команды сложения или вычитания.

STMicroelectronics и Texas Instruments также производят промышленные  микроконтроллеры на основе ранее упомянутой архитектуры Arm (Armv7‑M, Armv8‑M, Armv8‑A) [34, 35, 36, 37].

Отечественная компания «Микрон» выпускает микроконтроллеры на открытой архитектуре RISC-V [38, 39], используемой в измерительных приборах, медицинской технике, телекоммуникационном оборудовании, устройствах для умного дома и т. д. Также компания производит контроллеры для использования в платёжной системе «Мир» [40]. Архитектуру RISC-V мы упоминали выше. А по архитектуре контроллеров для платёжной системы «Мир» нет официального руководства. Встречается источник, в котором указано, что CPU построен на базе архитектуры 8051 [41]. В архитектуре 8051 команды инкремента и сложения работают с одинаковой скоростью [42].

Таким образом, для RISC‑процессоров использование инкремента не повышает эффективность кода: либо эта команда отсутствует, либо выполняется как сложение. 

2.4 GPU

NVIDIA

Сопроцессоры NVIDIA – ещё одна популярная вычислительная платформа. С быстрым развитием майнинга и нейросетей она стала одной из самой востребованной в мире.

В руководстве по системе команд «CUDA PTX ISA» (low-level parallel thread execution virtual machine and instruction set architecture) [43] 2025 года нет инкремента. Есть только команда сложения. В руководствах за предыдущие года такая же ситуация.

Поэтому получить ускорение за счёт инкремента, используя CUDA C++, не получится. Вычислительная платформа NVIDIA CUDA оптимизирована для параллельного запуска и выполнения миллионов легковесных потоков на тысячах ядер. Поэтому часто встречается рекомендация по «разворачиванию» циклов [44]. Удаление даже нескольких команд будет тиражироваться на миллионы параллельных потоков.

AMD

В руководствах GPU от AMD «RDNA4 ISA (2025)» [45] и «GCN3 ISA (2016)» [46] указано, что процессор содержит SIMD-блоки, состоящие из векторных и скалярных АЛУ. Именно скалярные АЛУ управляют ветвлениями и циклами, но в их системе команд нет инкремента. Следовательно, использовать его для ускорения вычислений не получится. 

3. Анализ работы компиляторов

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

Для этого можно воспользоваться онлайн-инструментом Compiler Explorer [47], который позволяет вставить код на C/С++, выбрать компилятор, указать параметры оптимизации и увидеть, какой ассемблерный код будет сгенерирован. При компиляции будем использовать параметры O0 – O3 (для оптимизация скорости выполнения кода) и Os (для оптимизация размера).

Будем компилировать упрощенный пример кода сложения векторов [48]:

#include <stdlib.h>
#include <stdio.h>

void randomInit (float * a, int n)
{
for (int i = 0; i < n; ++i)
a[i]=rand()/(float) RAND_MAX;
} 

int main(int argc, char* argv[])
{
const unsigned int numItems = 16777216; 

size_t size = numItems * sizeof(float); 

float* a = (float*)malloc(size);
float* b = (float*)malloc(size);
float* c = (float*)malloc(size);

randomInit(a,numItems);
randomInit(b,numItems);
 
for (int i = 0; i < numItems; ++i)
{
    c[i] = a[i] + b[i];
}

free(a);
free(b);
free(c);

return 0;
}

Начнём с анализа работы компилятора Microsoft x86 и x64 MSVC v19.44. При любых настройках оптимизации для первого цикла компилятор применяет инкремент.

В цикле функции main для параметров O1, O2 используется сложение, а для Os – инкремент.

Компилятор x86-64 Clang 21.1.0 применяет инкремент для O2 и Os, в остальных случаях используется сложение.

Компилятор x86-64 GCC 15.2 для всех параметров, кроме Os, применяет сложение для обоих циклов.

Компиляторы RISC-V и ARM GCC 15.2.0 всегда использует сложение.

Получается, что компиляторы ведут себя по-разному в зависимости от контекста использования операции инкремента, уровня оптимизации и архитектуры процессора. Например, MSVC v19.44 сохраняет команду INC даже при уровне оптимизации O2. Остальные компиляторы x86-64 заменяют инкремент на команду сложения, если требуется ускорить приложение или на инкремент, если требуется уменьшить размер кода. 

4. Подводим итоги

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

Сегодня утверждение «при использовании инкремента компилируется более оптимальный код за счёт использования специальных команд процессора (или точно такой же)» не совсем верно.

Правильнее сказать, что на большинстве современных платформ команда сложения (ADD) выполняется быстрее, чем инкремент (INC). Поэтому для ускорения кода надёжнее использовать именно её, либо проверять, что компилятор заменяет инкремент и декремент на сложение и вычитание.

Большинство современных компиляторов так и делают, заменяя ++i, i++, i = i + 1 на команду сложения. Однако есть исключения, например, компилятор MSVC v19.44, который даже при максимальной оптимизации (O2) использует команду INC.

Важно понимать, что через пять лет описанное выше может устареть. 

По анализу всех материалов можно дать следующие рекомендации.

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

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

Не забывайте про устаревание библиографии. Рекомендуйте учебники Г. Шилдта очень осторожно и всегда уточняйте, что почти каждый год (в том числе и в 2026) издатели перевыпускают его книги по C++, которые издавались в 1999 – 2004 годах. Характеристики «железа», компиляторы и стиль программирования изменились с момента их написания.

Если говорите об ускорении кода, то уточняйте, о каких видах (типах) вычислительных устройств и о каких производителях идёт речь. Как мы убедились, разница существенна даже в процессорах на одной архитектуре.

Например, в официальной документации CISC-архитектуры Intel встречается множество рекомендаций о необходимости замены инкремента на сложение, которые значительно повышают потенциал оптимизации. В описании системы команд инкремент уступает сложению по задержкам и пропускной способности для большого числа архитектур, включая энергоэффективные ядра (Gracemont), Atom (Silvermont, Airmont, Goldmont), Core (Broadwell, Haswell, Ivy Bridge) и др.

В документации по VLIW-архитектуре «Эльбрус» и Texas Instruments указано, что эффективнее выполняются операции, которые можно упаковать и параллельно обработать в одной широкой команде.

В документации ISA RISC-архитектуры (Apple, Qualcomm, MediaTek, Микрон и др.) и GPU (NVIDIA и AMD) нет команды инкремента. Или есть синтетическая команда INC, которая выполняется через сложение. Для векторных расширений RISC-архитектуры есть специализированные команды, которые работают эффективнее сложения. 

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

В следующей статье перейдём в практическую плоскость и проверим собранные рекомендации на практике.

Пожалуйста, пройдите опросы под статьёй.

Спасибо, до новых встреч!  

Список источников

  1. Книги по C++, которые можно рекомендовать разработчикам в 2023 году. URL: https://habr.com/ru/companies/ru_mts/articles/756446/

  2. Топ-10 книг по C++: от новичка до профессионала в 2025 году. URL: https://practicum.yandex.ru/blog/top-knig-po-izucheniyu-c-plus-plus/

  3. ТОП-10 книг по C++: от новичка до профессионала 2020. URL: https://proglib.io/p/top-10-knig-po-c-ot-novichka-do-professionala-2020-03-29?ysclid=mk28ougng5925481009

  4. ChatGPT. URL: https://chatgpt.com/

  5. Bjarne Stroustrup «Programming: Principles and Practice Using C++ Third Edition (2024). URL: https://www.stroustrup.com/programming.html

  6. Герберт Шилдт «C++ для начинающих. 2-е изд. (2026)». URL: https://www.piter.com/collection/all/product/c-dlya-nachinayuschih-2-e-izd

  7. Герберт Шилдт «C++: базовый курс. 3-е изд. (обл.) | Шилдт Герберт (2021)». URL: https://www.ozon.ru/product/c-bazovyy-kurs-3-e-izd-obl-shildt-gerbert-340198396/?at=PjtJEMR4ocWEJAJjUPLVDPqt6vrR3qh5E67yBCNK8n1r

  8. Stephen Prata «C Primer Plus Sixth Edition (2014)» URL:https://www.amazon.com/Primer-Plus-6th-Developers-Library/dp/0321928423

  9. Stephen Prata «С++ Primer Plus Sixth Edition (2012)». URL: https://www.amazon.com/Primer-Plus-6th-Developers-Library/dp/0321776402

  10. Скотт Мейерс «Наиболее эффективное использование C++ (2017)». URL: https://www.ozon.ru/product/naibolee-effektivnoe-ispolzovanie-s-35-novyh-rekomendatsiy-po-uluchsheniyu-vashih-programm-934324935/?__rr=1&abt_att=1&origin_referer=practicum.yandex.ru

  11. Скотт Мейерс «Эффективный и современный С++ (2019)». URL: https://www.ozon.ru/product/effektivnyy-i-sovremennyy-s-42-rekomendatsii-po-ispolzovaniyu-c-11-i-c-14-meyers-skott-149092825/

  12. ISO/IEC «14882 Programming languages – C++». URL: https://dokumen.pub/iso-iec-148822003-programming-languages-c-2nbsped.html

  13. Стенли Липпман «Язык программирования C++. Базовый курс (2019)». URL: https://www.labirint.ru/books/512910/

  14. Marius Bancila «Modern C++ Programming Cookbook (2020)». URL: https://www.amazon.com/Modern-Programming-Cookbook-language-standard/dp/1800208987

  15. Nicolai M. Josuttis «C++20 – The Complete Guide (2022)». URL: https://leanpub.com/cpp20

  16. Intel 64 and IA-32 Architectures Optimization Reference Manual: Volume 1. (2024). URL: https://www.intel.com/content/www/us/en/content-details/821612/intel-64-and-ia-32-architectures-optimization-reference-manual-volume-1.html

  17. Optimizing Earlier Generations of Intel 64 and IA-32 Processor Architectures, Throughput, and Latency. (2024). URL: https://www.intel.com/content/www/us/en/content-details/821614/optimizing-earlier-generations-of-intel-64-and-ia-32-processor-architectures-throughput-and-latency.html

  18. Intel 64 and IA-32 Architectures Optimization. (2024). URL: https://www.intel.com/content/www/us/en/developer/articles/technical/intel64-and-ia32-architectures-optimization.html

  19. Intel 8086 Family User's Manual October (1979). URL: http://matthieu.benoit.free.fr/cross/data_sheets/8086_family_Users_Manual.pdf

  20. Intel 80386 programmer's reference manual (1986). URL: https://community.intel.com/cipcp26785/attachments/cipcp26785/processors/81604/1/80386 Programmer's Reference Manual (Intel 1987).pdf

  21. AMD64 Architecture Programmer’s Manual. (2024). URL: https://docs.amd.com/search/all?query=AMD64+Architecture+Programmer%25E2%2580%2599s+Manual&content-lang=en-US

  22. Software Optimization Guide for AMD Family 17h Processors (2021). URL: https://docs.amd.com/search/all?query=Software+Optimization+Guide&value-filters=Product_custom~%2522Processors%2522&content-lang=en-US

  23. Руководство по эффективному программированию на платформе «Эльбрус» (2024). URL: https://mcst.ru/elbrus_prog

  24. C29x CPU Reference Guide (2025). URL: https://www.ti.com/lit/ug/spruiy2a/spruiy2a.pdf

  25. The C29 CPU – Unrivaled Real-Time Performance with Optimized Architecture on C2000 MCUs (2024). URL: https://www.ti.com/lit/wp/spradd8/spradd8.pdf

  26. Apple Silicon CPU Optimization Guide Version 4 (2025). URL: https://developer.apple.com/documentation/apple-silicon/cpu-optimization-guide

  27. Arm Architecture Reference Manual for A-profile architecture (2024). URL: https://developer.arm.com/documentation/ddi0487/maa/?lang=en

  28. OpenPOWER Foundation Power Instruction Set Architecture (2024). URL: https://openpowerfoundation.org/specifications/isa/

  29. OpenSPARC T2 (2007). URL: https://www.oracle.com/servers/technologies/opensparc-t2-page.html

  30. SPARC Technical Documents (1994). URL: https://sparc.org/technical-documents/

  31. Analog Devices Microcontrollers (2024). URL: https://www.analog.com/en/product-category/microcontrollers.html#category-detail

  32. Analog Devices MAX32655 (2024). URL: https://www.analog.com/en/products/max32655.html

  33. RISC-V Instruction Set Manual (2025). URL: https://riscv.atlassian.net/wiki/spaces/HOME/pages/16154769/RISC-V+Technical+Specifications#ISA-Specifications

  34. STMicroelectronics Microcontrollers & microprocessors (2025). URL: https://www.st.com/en/microcontrollers-microprocessors.html

  35. STM32 Cortex-M33 MCUs and MPUs programming manual (2025). URL: https://www.st.com/resource/en/programming_manual/pm0264-stm32-cortexm33-mcus-and-mpus-programming-manual-stmicroelectronics.pdf

  36. Texas Instruments Microcontrollers (MCUs) & processors (2019). URL: https://www.ti.com/product-category/microcontrollers-processors/overview.html

  37. AM437x Sitara Processors (2019). URL: https://www.ti.com/document-viewer/am4372/datasheet

  38. Микроконтроллеры (2025). URL: https://mikron.ru/catalog/mikrokontrollery/

  39. К1948ВК015 (MIK32 Амур). URL: https://mikron.ru/catalog/mikroskhemy-obshchepromyshlennogo-primeneniya/k1948vk015-mik32-amur/

  40. MIK51BC16D. URL: https://mikron.ru/catalog/rfid-produktsiya-i-smart-karty/mik51bc16d/

  41. MIK51BC16D (К5016ВК01) Однокристальный микроконтроллер с поддержкой криптографических алгоритмов, контактного и бесконтакного интерфейсов. URL: https://www.niime.ru/upload/products/MIK51BC16D(К5016ВК01)-рус.pdf

  42. MCS 51 MICROCONTROLLER FAMILY USER’S MANUAL (1994). URL: https://web.mit.edu/6.115/www/document/8051.pdf

  43. Parallel Thread Execution ISA Version 9.1 (2025). URL: https://docs.nvidia.com/cuda/parallel-thread-execution/

  44. CUDA Programming Guide Release 13.1 (2025). URL: https://docs.nvidia.com/cuda/cuda-programming-guide/

  45. AMD «RDNA4 Instruction Set Architecture» (2025). URL: https://docs.amd.com/search/all?query=RDNA&content-lang=en-US

  46. AMD «GCN3 Instruction Set Architecture (2016)» URL: https://docs.amd.com/search/all?query=gcn&content-lang=en-US

  47. Compiler Explorer. URL: https://godbolt.org/

  48. NVIDIA СUDA samples Vector Add. URL: https://github.com/NVIDIA/cuda-samples/blob/master/Samples/0_Introduction/vectorAdd/vectorAdd.cu

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.
Как часто и насколько глубоко вы прорабатываете источники при подготовке докладов и статей?
25%Не указываю источники, опираюсь на собственный опыт.3
8.33%Иногда указываю источники, т.к. нет времени и ресурсов на их анализ.1
16.67%Указываю 1–2 популярных источника (блоги, форумы, книги).2
16.67%Указываю авторитетные источники (стандарты, руководства, работы экспертов).2
33.33%Указываю авторитетные источники, проверяя актуальность информации.4
0%Указываю авторитетные источники, дополняя собственными экспериментами.0
Проголосовали 12 пользователей. Воздержались 13 пользователей.
Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.
Какая форма увеличения счётчика цикла кажется вам наиболее понятной?
58.7%i++54
17.39%++i16
6.52%i = i + 16
6.52%i += 16
10.87%Зависит от контекста10
Проголосовали 92 пользователя. Воздержались 4 пользователя.
Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.
Какую форму увеличения счётчика цикла вы чаще всего используете?
68.75%i++66
22.92%++i22
3.13%i = i + 13
2.08%i += 12
3.13%Зависит от контекста3
Проголосовали 96 пользователей. Воздержались 5 пользователей.