реклама на сайте
подробности

 
 
9 страниц V  « < 7 8 9  
Reply to this topicStart new topic
> WinAVR-20100110, Пишем отзывы сюда
Petka
сообщение Aug 16 2012, 14:09
Сообщение #121


Профессионал
*****

Группа: Свой
Сообщений: 1 453
Регистрация: 23-08-05
Пользователь №: 7 886



Цитата(ReAl @ Aug 16 2012, 16:48) *
С примерчиком нет проблем, хоть и, возможно, слегка натянутым. Нужно просто придумывать на периферии, а не в ОЗУ.
.....

В той оптимизации ТОЧНО всё нормально.
Цитата
6.5.3.1 Prefix increment and decrement operators
Constraints
The operand of the prefix increment or decrement operator shall have qualified or
unqualified real or pointer type and shall be a modifiable lvalue.
Semantics
The value of the operand of the prefix ++ operator is incremented. The result is the new
value of the operand after incrementation. The expression ++E is equivalent to (E+=1).
See the discussions of additive operators and compound assignment for information on
constraints, types, side effects, and conversions and the effects of operations on pointers.
The prefix -- operator is analogous to the prefix ++ operator, except that the value of the
operand is decremented.


Далее:
Цитата
6.5.16.2 Compound assignment
Constraints
For the operators += and -= only, either the left operand shall be a pointer to an object
type and the right shall have integer type, or the left operand shall have qualified or
unqualified arithmetic type and the right shall have arithmetic type.
For the other operators, each operand shall have arithmetic type consistent with those
allowed by the corresponding binary operator.
Semantics
A compound assignment of the form E1 op = E2 differs from the simple assignment
expression E1 = E1 op (E2)
only in that the lvalue E1 is evaluated only once.
Go to the top of the page
 
+Quote Post
ReAl
сообщение Aug 16 2012, 14:55
Сообщение #122


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



На мой взгляд, тут всё же играют свойства присваивающего выражения, а не compound assignment.

compound assignment играет тут:
Код
volatile unsigned char vc;
unsigned char ca[3];

void foo1() {  
        ++ca[vc]; // вот тут ca[vc] находится один раз
}

void foo2()
{
        ca[vc] = ca[vc] + 1; // а тут дважды
}


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
Petka
сообщение Aug 16 2012, 15:09
Сообщение #123


Профессионал
*****

Группа: Свой
Сообщений: 1 453
Регистрация: 23-08-05
Пользователь №: 7 886



Цитата(ReAl @ Aug 16 2012, 18:55) *
На мой взгляд, тут всё же играют свойства присваивающего выражения, а не compound assignment.
....

Я про оптимизацию этого куска кода:
Код
if (!(--rs->fifo.tx.cnt))

В нем оптимизатор всё сделал правильно. Никаких "вольных" трактовок volatile.
Go to the top of the page
 
+Quote Post
ReAl
сообщение Aug 17 2012, 05:53
Сообщение #124


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



А я про то, что к этой правильности evaluated only once не имеет отношения :-)
Код
volatile unsigned char vc;
unsigned char v;

void foo1()
{
    if (++vc == 0) v = 0; // тут для vc работает evaluated only once
}

void foo2()
{
    if ( (vc = vc + 1) == 0) v = 0; // тут для vc НЕ работает evaluated only once
}
Функции foo1() и foo2() компилируются одинаково разными версиями компиляторов.
4.5.3 в обеих функциях делает дополнительное считывание vc для проверки на 0
4.7.0 в обеих функциях не делает дополнительное считывание vc для проверки на 0

evaluated only once имеет отношение к тому примеру, который привел я. С ним наоборот —
в foo1() определение адреса элемента массива для инкремента делается один раз обеими комипляторами
в foo2() определение адресов элементов массива делается два раза обеими компиляторами, один раз для считывания, один раз для записи (у 4.7.0 немного эффективнее код, но логика та же — два раза подряд зачитывается vc, вычисляется два адреса в X и Z, потом ld reg, X $ inc reg $ st Z, reg ).

К обсуждаемой оптимизации имеет отношение другое место, то ж самое, которое относится к
Код
volatile unsigned char vc;
unsigned char v;
    v = vc = 0; // Напрямую писать 0 в v , а не считывать vc
А именно:
Цитата(ISO/IEC 9899 @ Dec 01 1999)
6.5.16 Assignment operators

3 An assignment operator stores a value in the object designated by the left operand. An assignment expression has the value of the left operand after the assignment, but is not an lvalue. An assignment expression has the value of the left operand after the assignment, but is not an lvalue. The type of an assignment expression is the type of the left operand unless the left operand has qualified type, in which case it is the unqualified version of the type of the left operand.

Т.е. ++vc, равно как и vc = vc + 1 имеют значение vc + 1 но имеет тип просто unsigned char. И вообще — не является lvalue, не есть объектом, cуществующим где-то, кроме временных ячеек абстрактной машины.

p.s[0] т.е., выходит даже, что это багфикс, а не улучшение оптимизатора ???
Что предыдущие компиляторы ни в коем случае не должны были зачитывать, так как это не требуется стандартом (и фактически отвергается -- «is not an lvalue», результат выражения равен значению правой части, приведенной к неквалифицированному типу левой, существует только как результат, но не как объект), но может породить (неучитываемый и неизвестный) побочный эффект?

p.s[1] Сергей Борщ: я так и не прочёл толком те линки, которые тогда по быстрячку нагуглил и тебе в джаббер кинул laughing.gif . Но, кажется, они об этом biggrin.gif


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Aug 17 2012, 19:44
Сообщение #125


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Код
volatile a;
a=a;// а как жеж вот это
(void) a; // или это

?
Go to the top of the page
 
+Quote Post
ReAl
сообщение Aug 18 2012, 06:56
Сообщение #126


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(_Pasha @ Aug 17 2012, 22:44) *
Код
volatile a;
a=a;// а как жеж вот это
(void) a; // или это

?

С a=a; всё нормально, один раз читается и один раз записывается. А для b = a = a; второй раз зачитывать a не нужно.

Со вторым хитрее, в C побочнй эффект от оценки выражения a; нужно выполнить, даже если само значение выражения нигде не используется.
В C++ вроде что-то с rvalue/lvalue похимичили и в таком месте зачитывание a вроде бы не обязательно. Не разобрался ещё.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Aug 25 2012, 09:28
Сообщение #127


Профессионал
*****

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



коллеги, так кто-нибудь знает, как заставить gcc 4.7.1 для AVR выдавать предуперждения в случае присваиваний вроде
Цитата
const char __flash * pcf;
const char * pc;

pcf = pc;
pc = pcf;

-Wall стоит, -Wextra не помогает.



Go to the top of the page
 
+Quote Post
_Pasha
сообщение Aug 25 2012, 09:43
Сообщение #128


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Дыкть.. ошибка должна быть, т.к. const... rolleyes.gif
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Aug 25 2012, 10:17
Сообщение #129


Профессионал
*****

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



Цитата(_Pasha @ Aug 25 2012, 13:43) *
Дыкть.. ошибка должна быть, т.к. const... rolleyes.gif


const и там и там. это разные адресные пространства.
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Aug 25 2012, 16:44
Сообщение #130


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(Genadi Zawidowski @ Aug 25 2012, 13:17) *
const и там и там. это разные адресные пространства.

Не знаю, что за путаница, но lvalue const это есть ошибка.
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Aug 25 2012, 17:27
Сообщение #131


Профессионал
*****

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



Речь о присваивании указателей на константные объекты в разных арресных пространствах.
Сам указатель не константный.
Константный указатель на константный char выглядит так:
const char * const p;
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Sep 21 2012, 20:28
Сообщение #132


Профессионал
*****

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



http://sourceforge.net/projects/mobileches...hots%20(Win32)/

появились
gcc 4.7.2
gcc 4.8.0

4.7.2 ещё компактнее, 4.8.0 в другую сторону.
Go to the top of the page
 
+Quote Post

9 страниц V  « < 7 8 9
Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 03:34
Рейтинг@Mail.ru


Страница сгенерированна за 0.01438 секунд с 7
ELECTRONIX ©2004-2016