Круглые скобочки против квадратных скобочек

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Dmitry Fedoseev
54979
Dmitry Fedoseev  

Соревнование перегрузки оператора [] и вызова обычного метода с параметрами.

1. Один параметр:

class C1{
   protected:
   int sum;
   public:
   void C1(){
      sum=0;
   }
   void operator [](int a){
      sum+=a;
   }
   int s(){
      return(sum);
   }
};

class C2{
   protected:
   int sum;
   public:
   void C2(){
      sum=0;
   }
   void fun(int a){
      sum+=a;
   }
   int s(){   
      return(sum);
   }
};

C1 c1;
C2 c2;

void OnStart(){

   long cnt=100000000;
   long s;

   s=GetTickCount();   
   for(int i=0;i<cnt;i++){
      c1[i];
   }
   Alert("Оператор: ",(GetTickCount()-s)," ",c1.s());
   
   s=GetTickCount();   
   for(int i=0;i<cnt;i++){
      c2.fun(i);
   }
   Alert("Функция: ",(GetTickCount()-s)," ",c2.s());   
   
}

Результат:

В общем, одинаковый результат. Первое число - это миллисекунды, второе не важно.

2. Два параметра:

class C1{
   protected:      
      class C0{
         public:     
            int i1;  
            int sum1;
            int sum2;
            void operator [](int i2){
               sum1+=i1;
               sum2+=i2;
            }   
      } c0;
   public:
      C0 * operator [](int a){
         c0.i1=a;
         return(GetPointer(c0));
      }
      int Sum1(){
         return(c0.sum1);
      }
      int Sum2(){
         return(c0.sum2);
      }
};

C1 c1;

class C2{
   protected:     
      int sum1;
      int sum2;
   public:
      void fun(int i1,int i2){
         sum1+=i1;
         sum2+=i2;
      }       
      int Sum1(){
         return(sum1);
      }
      int Sum2(){
         return(sum2);
      }
};

C2 c2;

void OnStart(){

   long s;
   long N=10000;

   s=GetTickCount();
   for(int i=0;i<N;i++){
   for(int j=0;j<N;j++){
      c1[i][j];
   }
   }
   Alert("Оператор: ",(GetTickCount()-s)," ",c1.Sum1()," ",c1.Sum2());
  
   s=GetTickCount();
   for(int i=0;i<N;i++){
   for(int j=0;j<N;j++){
      c2.fun(i,j);
   }
   }
   Alert("Функция: ",(GetTickCount()-s)," ",c2.Sum1()," ",c2.Sum2());   
}

Результат:

Здесь так же: первое число - это миллисекунды. 

Налицо неоспоримое преимущество обычной функции, без выпендрежа с перегрузкой оператора.

А может есть какой-то более быстрый способ с двумя параметрами (с оператором)?

Vladimir Simakov
5346
Vladimir Simakov  
Dmitry Fedoseev:

Соревнование перегрузки оператора [] и вызова обычного метода с параметрами.

1. Один параметр:

Результат:

В общем, одинаковый результат. Первое число - это миллисекунды, второе не важно.

2. Два параметра:

Результат:

Здесь так же: первое число - это миллисекунды. 

Налицо неоспоримое преимущество обычной функции, без выпендрежа с перегрузкой оператора.

А может есть какой-то более быстрый способ с двумя параметрами (с оператором)?

Вот этот оператор перегрузите [,] и сравните. То, что у Вас - это двойной вызов оператора, против одного вызова метода,- а каждый вызов - это поднятие команд на стек, выполнение, раскрутка стека.
Dmitry Fedoseev
54979
Dmitry Fedoseev  
Vladimir Simakov:
Вот этот оператор перегрузите [,] и сравните. То, что у Вас - это двойной вызов оператора, против одного вызова метода,- а каждый вызов - это поднятие команд на стек, выполнение, раскрутка стека.

Даже так пробовал:

void operator (.)(.)(int a,int b)

Но не хочет даже компилироваться.

Vladimir Simakov
5346
Vladimir Simakov  
Dmitry Fedoseev:

Даже так пробовал:

Но не хочет даже компилироваться.

Вот так попробуй
T operator [] (int i,int ii) {}
Вызов: test[i,ii];
Если не получится, значит нельзя у них так, хотя и должно быть.
Я от компа за 2500 км, так что сам пока проверить не могу.
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий