Цитата(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_));
}
Причина редактирования: Уменьшение видимого размера цитаты исходника.