|
0 / 0 / 0
Регистрация: 20.03.2026
Сообщений: 13
|
||||||
Цикл for() - блок инициализации14.04.2026, 00:38. Показов 3400. Ответов 37
Метки нет (Все метки)
Пример:
Компилятор не ругается, но пример не работает. По факту - то, что видно в отладчике, в этом примере переменная "m" в цикле не инициализируется и не меняется: - она имеет до for() некое значение, которое сохраняется... Но, похоже, что это отладчик запутался в области видимости - т.е., в он вместо внутренней для for() переменной "m" (которая, видимо, всё-таки создаётся) показывает мне внешнюю по отношению к for() переменную "m"... Если инициализацию "m" поставить перед объявлением "i", то компилятор будет ругаться. Если инициализацию "m" сделать перед for(), то пример начинает работать... Компилер - GCC "arm-gnu-toolchain-15.2.rel1-mingw-w64-x86_64-arm-none-eabi" с опцией "-std=c2x".
0
|
||||||
| 14.04.2026, 00:38 | |
|
Ответы с готовыми решениями:
37
Влият ли при инициализации цикла for инкрементирование значения |
|
фрилансер
6498 / 5729 / 1133
Регистрация: 11.10.2019
Сообщений: 15,303
|
||||
| 15.04.2026, 07:18 | ||||
|
zss, в C нет ссылок, поэтому я про указатель сказал.
::x - это доступ к глобальной переменной.А вот дальше о_О В данном случае массив состоит из одного элемента - переменной. С++ -O0 https://onlinegdb.com/LMGohtJ0o 1 -10762399973С++ -O3 https://onlinegdb.com/HhvaWniiY 1 231683Добавлено через 30 минут Если объекты не лежат в одном массиве, так делать нельзя
1
|
||||
|
1507 / 524 / 75
Регистрация: 22.09.2023
Сообщений: 1,654
|
|
| 15.04.2026, 08:46 | |
|
0
|
|
|
Вездепух
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,312
|
||
| 15.04.2026, 09:12 | ||
|
Это в массиве элементы обязаны быть расположены рядом.
1
|
||
|
0 / 0 / 0
Регистрация: 20.03.2026
Сообщений: 13
|
|||||||
| 15.04.2026, 11:44 [ТС] | |||||||
|
Сравнил по дизассемблеру поведение size_t, uint8_t, uint_fast8_t и uint_least8_t в качестве "объявляемого" счётчика цикла и переменной цикла стековой и статической (ключи оптимизации компилятору не указывал): 1. Разницы между size_t и uint_fast8_t я не увидел - размер берётся в 4 байта. 2. Разницы между uint8_t и uint_least8_t я не увидел - размер берётся в 1 байт. 3. Разницы uint8_t (1 байт) по отношению к size_t (4 байта) не увидел, за исключением того, что для uint8_t используются strb/ldrb вместо str/ldr, как для size_t. И для переменной цикла "static uint8_t" используется дополнительная команда перекладки байта в слово_32 "uxtb r2, r3" после r3++. 4. Из стека переменная достаётся на команду быстрее: для статической переменной сначала грузится её адрес, а потом по этому адресу она достаётся или кладётся.
0
|
|||||||
|
фрилансер
6498 / 5729 / 1133
Регистрация: 11.10.2019
Сообщений: 15,303
|
|
| 15.04.2026, 11:48 | |
|
S17, а зачем здесь статическая переменная ?
0
|
|
|
0 / 0 / 0
Регистрация: 20.03.2026
Сообщений: 13
|
||
| 15.04.2026, 12:45 [ТС] | ||
|
По дизассемблеру можно и не понять потерь в производительности из-за "невыровненного" доступа, т.к. ARM сам может его "переварить" без помощи компилятора: The Cortex-M4 processor supports ARMv7 unaligned accesses, and performs all accesses as single, unaligned accesses. They are converted into two or more aligned accesses by the DCode and System bus interfaces. Note All Cortex-M4 external accesses are aligned. ...(Unaligned accesses that cross regions)
0
|
||
|
338 / 130 / 10
Регистрация: 19.07.2024
Сообщений: 710
|
||||
| 15.04.2026, 13:01 | ||||
|
Добавлено через 5 минут И естественно - без static.
1
|
||||
|
Вездепух
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,312
|
|||
| 15.04.2026, 17:04 | |||
|
Независимо от того, на какой платформе вы работаете, в программе на С нет смысла заводить одиночные локальные переменные размера меньше чем int, когда на то нет особых причин. Переменные меньших типов имеют право на существование только для каких-нибудь специальных целей и специальных случаев (требуется особое поведение при переполнении, тип навязан внешним API, и т.д). Нет специальных требований? Тогда int или unsigned int или что-то побольше.unsigned int? Значит используйте unsigned int. А компилятор потом сам куда надо и во что надо "попадет".
1
|
|||
|
0 / 0 / 0
Регистрация: 20.03.2026
Сообщений: 13
|
|
| 15.04.2026, 18:20 [ТС] | |
|
jcxz, TheCalligrapher - Ок, соглашусь, спасибо!
0
|
|
|
Вездепух
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,312
|
||
| 16.04.2026, 17:34 | ||
|
В случае со статической переменной все это "грузится" возникает скорее потому, что компилятор побоялся выкинуть эту переменную из кода целиком (да и сам код вместе с ней) и поэтому вынужден читать данные из памяти и записывать их обратно в память. То есть в большинстве случаев преимущество локальной переменной не в том, что она в стеке, а в том, что она не в памяти вообще, она - в регистре.
0
|
||
|
4146 / 2724 / 433
Регистрация: 09.09.2017
Сообщений: 12,067
|
||||||||
| 17.04.2026, 10:53 | ||||||||
|
Компилятор вынужден добавлять лишний код чтобы привести 32-битный регистр к указанному вами диапазону переменной. Причем переменные-то эти у вас локальные, то есть почти всегда лежат в регистрах, а там хоть 1 бит, хоть 32, расходуется все равно один регистр. Да и даже если приходится хранить на стеке - при выходе из функции он все равно сбросится и не будет расходовать память.
1
|
||||||||
|
Злостный нарушитель
10878 / 5817 / 1288
Регистрация: 12.03.2015
Сообщений: 26,855
|
|
| 17.04.2026, 11:27 | |
|
0
|
|
|
4146 / 2724 / 433
Регистрация: 09.09.2017
Сообщений: 12,067
|
|
| 17.04.2026, 13:54 | |
|
Там двадцать строчек, причем интерес представляют не сточки кода, а вывода на терминал.
}$gcc main.c -Wall -Wextra -Wpedantic но вот это косяк, да. Надо было добавить пустую строчку в конец.
0
|
|
|
0 / 0 / 0
Регистрация: 20.03.2026
Сообщений: 13
|
||||||||||||
| 18.04.2026, 20:11 [ТС] | ||||||||||||
|
Тест был в виде подпрограммы - там было 4 цикла со счётчиками и переменными цикла: size_t, uint8_t, uint_fast8_t и uint_least8_t. И ещё таких же 4 цикла, где переменные цикла - статические. Оптимизации нет. Для 8ми счётчиков, хоть все они локальные внутри for(), было выделено 8 слов_32 в стеке. Там, где счётчики цикла байтовые uint8_t или uint_least8_t к ним в то же слово_32 рядом клался байт переменной цикла uint8_t или uint_least8_t, когда она не статическая. Все (++) делались в регистрах, но перед и после шло обращение в память, даже если на следющей операции нужен тот же счётчик для сравнения с условием завершения цикла. Если переменная статическая, то к этим обращениям в память каждый раз добавлялись загрузки адреса этой статической переменной, по которому дальше она считывалась/записывалась. Если переменная цикла байтовая uint8_t или uint_least8_t, то после (++) добавлялось обрезание до байта (uxtb r2, r3). Код компилировался, но не линковался, т.к. нигде не использовался... Пример цикла:
0
|
||||||||||||
|
Вездепух
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,312
|
|||
| 18.04.2026, 20:48 | |||
|
Ваши изначальные соображения, как я понял, были ориентированы на оценку производительности кода и/или оценку потребления памяти. Для таких целей рассматривать сгенерированный отладочный код - пустая трата времени.
1
|
|||
|
4146 / 2724 / 433
Регистрация: 09.09.2017
Сообщений: 12,067
|
||
| 19.04.2026, 10:09 | ||
|
0
|
||
|
0 / 0 / 0
Регистрация: 20.03.2026
Сообщений: 13
|
||
| 20.04.2026, 00:54 [ТС] | ||
|
0
|
||
|
2493 / 1157 / 709
Регистрация: 25.04.2016
Сообщений: 3,338
|
||||||
| 06.05.2026, 10:32 | ||||||
0
|
||||||
| 06.05.2026, 10:32 | |
|
Как написать функцию инициализации числа из целой переменной и сохранения числа в целую переменную?
Предупреждение: при инициализации целое преобразуется в указатель без приведения типа Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С.
Задача:
Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
|
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
|
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
|
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701
Купил два термопринтера QR701.
На сэлф-тесте написано:
Language: PC936 (GB18030).
Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
|
|
Создание формы заимствованного документа
Maks 03.08.2026
Задача:
Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также
табличная часть со следующими реквизитами:
- Расчетный счет покупателя. . .
|
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача:
В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
|
Почему SEO не начинается с ключевых слов: что проверить до написания текстов
Neotwalker 01.08.2026
Когда владельцу сайта предлагают заняться SEO, первым шагом часто становится сбор запросов и написание текстов.
Логика кажется понятной:
1. Находим ключевые слова.
2. Добавляем их на. . .
|
Знание — сила: Доктрина интенциональности знаний, углубление в формулу
Hrethgir 01.08.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11957&stc=1&d=1785567302
Знаменитый афоризм Фрэнсиса Бэкона «Знание — сила» (Scientia potentia est) в массовой культуре принято понимать. . .
|