tiix
1

использование переменных

23.02.2013, 01:31. Показов 9011. Ответов 36
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день господа.
Подскажите какой вариант использования переменных более правильный с точки зрения быстроты и размера кода генерируемого WinAVR?
Сам в асме не шарю, поэтому просмотр листинга не советовать :)
Например затолкать в глобальную структуру:
Код
typedef struct{
u08 buffer[UART_MAX_BUF];
u08 status;
u08 counter;
u08 header_len;
u08 message_len;
u08 crc;
} TUartData;

TUartData uart;
и обращаться к ним по так:
Код
uart.status |= (1<<5);
for (u08 i=0;i<10;i++)
uart.buffer[i] = i;
или же простые глобальные переменные:
Код
u08 uart_buffer[UART_MAX_BUF];
u08 uart_status;
u08 uart_counter;
u08 uart_header_len;
u08 uart_message_len;
u08 uart_crc;
соответственно:
Код
uart_status |= (1<<5);
for (u08 i=0;i<10;i++)
uart_buffer[i] = i;
или это пофиг и компилятор сведет к одному виду?
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.02.2013, 01:31
Ответы с готовыми решениями:

Использование переменных в прерываниях
В stm32F103 изучаю USORT. Создал передачу через прерывание. Но возник вопрос, как делать блокировки...

Использование переменных в БД
Моя БД: :- dynamic question/1. question(). question(). Хотелось бы при вводе question(),...

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

Использование переменных
Доброго времени суток подскажите как можно в исполняемом файле использовать переменные на подобе...

36
4 / 4 / 0
Регистрация: 12.03.2013
Сообщений: 24
23.02.2013, 01:47 2
смотря как структуры выравниваются, если по 1 байту то вроде как без разницы
0
0 / 0 / 0
Регистрация: 01.02.2011
Сообщений: 275
23.02.2013, 13:14 3
Для AVR - без разницы, код будет абсолютно одинаковым
0
0 / 0 / 0
Регистрация: 15.11.2012
Сообщений: 483
23.02.2013, 14:14 4
Это от компилятора зависит, а не от целевой платформы. Большинство компиляторов (в том числе GCC) достаточно умны, чтобы скомпилировать одинаковый код в обоих случаях при включенной оптимизации. WinAVR, насколько я помню, виндовый порт AVR-GCC.

С точки зрения хорошего стиля первый вариант, конечно, лучше.
0
0 / 0 / 0
Регистрация: 22.08.2009
Сообщений: 525
23.02.2013, 15:03 5
Цитата Сообщение от soxop
Это от компилятора зависит, а не от целевой платформы. Большинство компиляторов (в том числе GCC) достаточно умны, чтобы скомпилировать одинаковый код в обоих случаях при включенной оптимизации. WinAVR, насколько я помню, виндовый порт AVR-GCC.

С точки зрения хорошего стиля первый вариант, конечно, лучше.
А с точки зрения эффективности кода, может быть и третий вариант. По крайней мере в сравнении с приведенными выше вариантами. Или нет?
0
0 / 0 / 0
Регистрация: 15.11.2012
Сообщений: 483
23.02.2013, 15:41 6
Какой третий вариант?
0
0 / 0 / 0
Регистрация: 22.08.2009
Сообщений: 525
23.02.2013, 16:26 7
Цитата Сообщение от soxop
Какой третий вариант?
Использовать указатели. Или нет?
0
0 / 0 / 0
Регистрация: 15.11.2012
Сообщений: 483
23.02.2013, 16:37 8
Не понимаю. Можете код привести?
0
0 / 0 / 0
Регистрация: 22.08.2009
Сообщений: 525
23.02.2013, 17:36 9
Цитата Сообщение от soxop
Не понимаю. Можете код привести?
Код - не проблема. А смысл? ТС все равно оценить не сможет, так как он, по его словам, в асм "не шарит".
0
0 / 0 / 0
Регистрация: 15.11.2012
Сообщений: 483
23.02.2013, 18:09 10
Bytt, ход ваших мыслей я так и не распарсил. Топикстартер привёл два сишных кода и спрсил, будет ли разница в машинном коде. Ему ответили. А вы про какой-то третий вариант с указателями...
0
0 / 0 / 0
Регистрация: 22.08.2009
Сообщений: 525
23.02.2013, 18:24 11
Цитата Сообщение от soxop
Bytt, ход ваших мыслей я так и не распарсил. Топикстартер привёл два сишных кода и спрсил, будет ли разница в машинном коде. Ему ответили. А вы про какой-то третий вариант с указателями...
А что тут непонятного? ТС получил ответ на свой вопрос, не так ли? Но если говорить об эффективности кода, то оба варианта не самые эффективные. Использование указателя, вполне вероятно, сократит размер кода. Вот только нужно ли это ТС?
0
0 / 0 / 0
Регистрация: 15.11.2012
Сообщений: 483
23.02.2013, 18:36 12
Ну так приведите этот ваш "эффективный код с указателями" (доказав этим его существование). Посмотрим и поучимся.
0
0 / 0 / 0
Регистрация: 01.02.2011
Сообщений: 275
23.02.2013, 19:39 13
Это уже изыски. Будет зависеть от используемого уровня оптимизации. С -Os, с указателем получится наверняка длиннее. С -O3 - короче, но длиннее, чем с -Os :)
0
0 / 0 / 0
Регистрация: 22.08.2009
Сообщений: 525
23.02.2013, 20:10 14
Цитата Сообщение от soxop
Ну так приведите этот ваш "эффективный код с указателями" (доказав этим его существование). Посмотрим и поучимся.
Нет проблем
Код
char  *cp =  uart.buffer;
for (u08 i=0;i<10;i++)
*cp++ = i;
Или нет?
0
4 / 4 / 0
Регистрация: 12.03.2013
Сообщений: 24
23.02.2013, 20:13 15
Цитата Сообщение от Bytt
Цитата Сообщение от soxop
Ну так приведите этот ваш "эффективный код с указателями" (доказав этим его существование). Посмотрим и поучимся.
Нет проблем
Код
char  *cp =  uart.buffer;
for (u08 i=0;i<10;i++)
*cp++ = i;
Или нет?
и чем же cp понятней чем uart.buffer?
имхо бред
0
0 / 0 / 0
Регистрация: 22.08.2009
Сообщений: 525
23.02.2013, 20:27 16
Цитата Сообщение от buy
Цитата Сообщение от Bytt
Цитата Сообщение от soxop
Ну так приведите этот ваш "эффективный код с указателями" (доказав этим его существование). Посмотрим и поучимся.
Нет проблемКод:
char *cp = uart.buffer;
for (u08 i=0;i<10;i++)
*cp++ = i;Или нет?
и чем же cp понятней чем uart.buffer?
имхо бред
Дело не в понятности кода, все дело в его эффективности.
0
tiix
23.02.2013, 21:59 17
Цитата Сообщение от soxop
Ну так приведите этот ваш "эффективный код с указателями" (доказав этим его существование). Посмотрим и поучимся.
Ну да, скорее всегоэто будет выглядеть так:
Код
обьявляем структуру и указатель на нее:
typedef struct{
u08 buffer[UART_MAX_BUF];
u08 status;
u08 message_len;
u08 counter;
u08 header_len;
u08 crc;
} TUartData;
TUartData uart;
TUartData *P_uart;

какаято функция:

void crc8(TUartData *uart) {
u08 crc = 0;
u08 len = uart->message_len;
while (len--) {
crc = uart->buffer[len-1]+crc;
}
uart->crc = crc;
}

void main() {
crc8(P_uart);
}
про этот вариант я тож думал.
Но вопрос: не получится ли так, что компилятор разместит структуру целиком в стеке для работы?
А если там buffer[] длинной 512 или 1024 байт???
0 / 0 / 0
Регистрация: 15.11.2012
Сообщений: 483
23.02.2013, 22:03 18
Цитата Сообщение от Bytt
Цитата Сообщение от soxop
Ну так приведите этот ваш "эффективный код с указателями" (доказав этим его существование). Посмотрим и поучимся.
Нет проблем
Код
char  *cp =  uart.buffer;
for (u08 i=0;i<10;i++)
*cp++ = i;
Или нет?
Нет. Современные компиляторы достаточно умны, чтобы упростить изначальный код топикстартера до вашего.

Вообще, низкоуровневая оптимизация -- это на 100% задача компилятора. Прагриннист должен писать ясный и поддерживаемый код. Для этого ему и дан высокоуровневый язык, абстрагированный от аппаратуры. Если же программист желает взять оптимизацию кода под свой контроль, то ему нужно писать на ассемблере. "Подыгрывать" компилятору -- плохой тон. Самый смех, что иногда таким подыгрыванием программист только мешает оптимизатору и конечный машинный код выходит хуже.
0
tiix
23.02.2013, 22:04 19
Цитата Сообщение от btymdmom
Это уже изыски. Будет зависеть от используемого уровня оптимизации. С -Os, с указателем получится наверняка длиннее. С -O3 - короче, но длиннее, чем с -Os :)
не понял логики... "короче, но длиннее" это как? ))
0 / 0 / 0
Регистрация: 15.11.2012
Сообщений: 483
23.02.2013, 22:12 20
Цитата Сообщение от tiix
Но вопрос: не получится ли так, что компилятор разместит структуру целиком в стеке для работы?
Структура "uart", которую вы определили в глобальной области, будет в глобальной области. Стандарт гарантирует.

А если там buffer[] длинной 512 или 1024 байт???
Ничего. Смотрите на структуру лишь как на способ сгруппировать переменные. Код будет одинаковый, что с такой группировкой, что без неё. Но со структурой вы получите более читаемый код, не будете захламлять пространство имён и заимеете новый тип, а значит сможете создавать его экземляры где и когда нужно, пулять их между функциями по указателю и другие профиты.
0
23.02.2013, 22:12
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.02.2013, 22:12
Помогаю со студенческими работами здесь

Использование переменных
Здравствуйте. есть два слушателя. при нажатии хочу сохранить в X1, Y1 координату нажатия мыши, и...

Использование переменных
Раз в минуту получаю значение txtti0.text из *.xml (содржимое которого тоже обновляется) Как...

Использование переменных
Как я могу использовать переменные из одной функции в другой и перезаписывать их (переменные)?

Использование переменных из файла
Здравствуйте. Подскажите, каким образом можно реализовать создание переменных из файла. К...

Использование анонимных переменных
Листинг небольшой программы на прологе Цель достаточно простая: нужно определить возможного убийцу...

Правильное использование переменных
Всем Ку) Читаю муны и почти везде юзают,на мой взгляд лишние переменные. Например ...

Использование глобальных переменных
Добрый всем день! Использую глобальную переменную для хранения значения в пределах одного сеанса...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru