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

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> Порядок выполнения операций. Вопрос зантокам!
Dima_G
сообщение Nov 11 2009, 16:15
Сообщение #16


Местный
***

Группа: Свой
Сообщений: 279
Регистрация: 2-07-08
Из: Новосибирск
Пользователь №: 38 699



Цитата(Demeny @ Nov 11 2009, 16:55) *
Бред какой ...
Только что проделал такое с VC 6. Результирующий exe-файл в обоих случаях идентичный (проверено тотал коммандером).


Потому, что умный компилятор соптимизировал. Но не слишком надейтесь на то, что так будет всегда. Попробуйте проверить с объектом класса с определенным оператором пост и прединкремента
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Nov 11 2009, 16:28
Сообщение #17


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(Dima_G @ Nov 11 2009, 22:15) *
...Но не слишком надейтесь на то, что так будет всегда...

В 2012-ом все компиляторы дружно разучатся оптимизировать biggrin.gif


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
Dima_G
сообщение Nov 11 2009, 16:32
Сообщение #18


Местный
***

Группа: Свой
Сообщений: 279
Регистрация: 2-07-08
Из: Новосибирск
Пользователь №: 38 699



Цитата(GetSmart @ Nov 11 2009, 20:28) *
В 2012-ом все компиляторы дружно разучатся оптимизировать biggrin.gif


Имелось в виду - при смене компилятора / платформы / типа данных laughing.gif
Go to the top of the page
 
+Quote Post
zltigo
сообщение Nov 11 2009, 17:41
Сообщение #19


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Dima_G @ Nov 11 2009, 19:15) *
Потому, что умный компилятор соптимизировал.

А дураки среди компиляторов вымирают, посему пересказывать байки начала 90x не надо. Поздно.
Цитата
Попробуйте проверить с объектом класса с определенным оператором пост и прединкремента

"определенным" это то, что люди называют перегруженным оператором? Это во-первых C++, а во-вторых еще проще для оптимизатора, ибо по стандарту перегрузка оператора заменяется на вызов функции - и никаких фантазий для неправильной оптимизации вообще нет. Нут тебe и железнейшая sequence points еще до кучи.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Dima_G
сообщение Nov 12 2009, 04:31
Сообщение #20


Местный
***

Группа: Свой
Сообщений: 279
Регистрация: 2-07-08
Из: Новосибирск
Пользователь №: 38 699



Цитата(zltigo @ Nov 11 2009, 20:41) *
А дураки среди компиляторов вымирают, посему пересказывать байки начала 90x не надо. Поздно.

"определенным" это то, что люди называют перегруженным оператором? Это во-первых C++, а во-вторых еще проще для оптимизатора, ибо по стандарту перегрузка оператора заменяется на вызов функции - и никаких фантазий для неправильной оптимизации вообще нет. Нут тебe и железнейшая sequence points еще до кучи.


Да, перегруженным.
Вот пример класса. В нем перегружены операторы инкремента

CODE
#include <stdio.h>
#include <time.h>
#include <sys/time.h>

typedef struct timeval TTime;

/////////////////////////////////////////////////
class ClTest
{
public:
int aiBuf_m[1024];

ClTest()
{
aiBuf_m[0] = 0;
}

//Prefix form of increment
ClTest& operator ++()
{
++aiBuf_m[0];
return *this;
}

//Postfix form of increment
ClTest operator ++(int)
{
ClTest clRetValue_ = *this;
++aiBuf_m[0];
return clRetValue_;
}
};

/////////////////////////////////////////////////
unsigned int GetInterval(TTime* psBegin_, TTime* psEnd_)
{
return (psEnd_->tv_usec - psBegin_->tv_usec) + (psEnd_->tv_sec - psBegin_->tv_sec)*1000000;
}

/////////////////////////////////////////////////
int main()
{
TTime sBeginTime_, sEndTime_;
static const unsigned int ITTERATIONS_CNT = 100000;

{
ClTest clTest_;

gettimeofday(&sBeginTime_, NULL);

for (;clTest_.aiBuf_m[0] != ITTERATIONS_CNT; ++clTest_)
continue;

gettimeofday(&sEndTime_, NULL);

printf("Prefix form: time = %u\n", GetInterval(&sBeginTime_, &sEndTime_));
}

{
ClTest clTest_;

gettimeofday(&sBeginTime_, NULL);

for (;clTest_.aiBuf_m[0] != ITTERATIONS_CNT; clTest_++)
continue;

gettimeofday(&sEndTime_, NULL);

printf("Postfix form: time = %u\n", GetInterval(&sBeginTime_, &sEndTime_));
}

return 0;
}


Вот результат его работы (GCC 4.1.2, оптимизация выключена):
Цитата
Prefix form: time = 520
Postfix form: time = 116160


Естественно, при включенной оптимизации эти значения выравниваются. Но не факт, что оптимизация пройдет на более сложных примерах.
Слышал, что люди, хорошо владеющие STL и тп вещами, аккуратнее относятся к пост и пред инкременту.


Собственно, немного изменил пример, и GCC на оптимизации O3 сдулся

Цитата
Prefix form: time = 68
Postfix form: time = 89358


CODE
{
ClTest clTest_;
volatile int i;

gettimeofday(&sBeginTime_, NULL);

for (;clTest_.aiBuf_m[0] != ITTERATIONS_CNT; )
i = (++clTest_).aiBuf_m[0];

gettimeofday(&sEndTime_, NULL);

printf("Prefix form: time = %u\n", GetInterval(&sBeginTime_, &sEndTime_));
}

{
ClTest clTest_;
volatile int i;

gettimeofday(&sBeginTime_, NULL);

for (;clTest_.aiBuf_m[0] != ITTERATIONS_CNT; )
i = (clTest_++).aiBuf_m[0];

gettimeofday(&sEndTime_, NULL);

printf("Postfix form: time = %u\n", GetInterval(&sBeginTime_, &sEndTime_));
}
Причина редактирования: Уменьшение видимого размера цитаты исходника.
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Nov 12 2009, 07:22
Сообщение #21


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Кстати, во FreeRTOS встречаются оба варианта инкремента (без доп. действий) одинакого часто. Автор мечется в сомнении ?! biggrin.gif


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
Flexz
сообщение Nov 12 2009, 07:56
Сообщение #22


Местный
***

Группа: Свой
Сообщений: 252
Регистрация: 9-10-08
Из: Московская обл.
Пользователь №: 40 797



FreeRTOS просто, видимо, разные люди пишут smile.gif
У Страуструпа, кстати, там где int - постинкремент, а там где итератор - прединкремент
Go to the top of the page
 
+Quote Post
HARMHARM
сообщение Nov 12 2009, 07:58
Сообщение #23


читатель даташитов
****

Группа: Свой
Сообщений: 853
Регистрация: 5-11-06
Из: Днепропетровск
Пользователь №: 21 999



Цитата(Flexz @ Nov 12 2009, 09:56) *
FreeRTOS просто, видимо, разные люди пишут smile.gif

Нет, там один человек. Впрочем, по коду, который долгое время эволюционирует, можно проследить как эволюционирует сам программист smile.gif
Go to the top of the page
 
+Quote Post
Dima_G
сообщение Nov 12 2009, 08:00
Сообщение #24


Местный
***

Группа: Свой
Сообщений: 279
Регистрация: 2-07-08
Из: Новосибирск
Пользователь №: 38 699



Цитата(Flexz @ Nov 12 2009, 11:56) *
У Страуструпа, кстати, там где int - постинкремент, а там где итератор - прединкремент

Со встроенными типами практически всегда это без разницы - компилятор соптимизирует smile.gif (хотя, вдруг выйдет новая интересная платформа + сырой комиплятор rolleyes.gif )

Но лично мне не нравится такой зоопрак из ++i и i++ в программе sad.gif
Поэтому пишу единообразно, используя ++i
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Nov 12 2009, 15:32
Сообщение #25


;
******

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



Цитата(Dima_G @ Nov 12 2009, 12:00) *
Но лично мне не нравится такой зоопрак из ++i и i++ в программе sad.gif
Поэтому пишу единообразно, используя ++i

Ладно-ладно. А volatile-переменные тоже по-умному "додумываются" ? Или все-таки есть разница? wink.gif
Go to the top of the page
 
+Quote Post
Dima_G
сообщение Nov 13 2009, 03:18
Сообщение #26


Местный
***

Группа: Свой
Сообщений: 279
Регистрация: 2-07-08
Из: Новосибирск
Пользователь №: 38 699



Цитата(_Pasha @ Nov 12 2009, 19:32) *
Ладно-ладно. А volatile-переменные тоже по-умному "додумываются" ? Или все-таки есть разница? wink.gif

rolleyes.gif
Чет не пойму, что Вы имеете в виду laughing.gif
Go to the top of the page
 
+Quote Post
defunct
сообщение Nov 13 2009, 13:46
Сообщение #27


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(igorenja @ Nov 11 2009, 10:02) *
Короче говоря единственно правильный вариант:
Код
twi_write_data(0,ptr, data[ptr]);
ptr++;

До единственно правильного далеко т.к. есть пара вопросов:
1. На кой в twi_write_data передавать "ptr"?
2. На кой индекс неверно обзывать поинтером?

Два единственно правильных варианта:

- twi_write_data( 0, *ptr++ )
- twi_write_data( 0, data[ i++ ] );
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Nov 14 2009, 01:22
Сообщение #28


;
******

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



Цитата(Dima_G @ Nov 13 2009, 06:18) *
rolleyes.gif
Чет не пойму, что Вы имеете в виду laughing.gif

Коль скоро для volatile оптимизации запрещены, то разница между ++j и j++ (volatile j) должна наблюдаться на любых компиляторах.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 18th July 2025 - 15:49
Рейтинг@Mail.ru


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