And no, I cannot move the for loop inside the if, because the
(omitted) code inside the for loop is huge, and I would hate to
duplicate it in the both if clauses...


Thanks Dmitry!


On Mon, May 30, 2011 at 3:12 PM, Dmitry Muraviev <muravi...@gmail.com> wrote:
> А почему вы не хотите перенести цикл внутрь условия?
>
>
>
> On 2011/May/30, at 16:02:09, Oleg Krupnov wrote:
>
>> This question is related to C language, rather than Obj-C.
>>
>> I have a data structure
>>
>> typedef struct
>> {
>>  int x;
>>  int y;
>> } A;
>>
>> In my code, I have a function foo(bool xOrY) that runs a long-lasting
>> loop that iterates through a huge array of A structures and for each
>> structure, it should get x or y field. The choice of x or y is the
>> same on each iteration, but may change between different calls of
>> foo(bool xOrY).
>>
>> void foo(bool xOrY)
>> {
>>  for(int i = 0; i < count; ++i)
>>  {
>>     if (xOrY)
>>     {
>>         int value = a[i].y;
>>         ...
>>     }
>>     else
>>     {
>>         int value = a[i].x;
>>         ...
>>     }
>>  }
>> }
>>
>> I am looking to optimize this code, because the line if(xOrY) yields
>> the same result on each step. So I am thinking about this code:
>>
>>
>> void foo(bool xOrY)
>> {
>>  struct A test;
>>  size_t offset = 0;
>>  if (xOrY)
>>  {
>>     offset = (char*)&(a.y) - (char*)&a;
>>  }
>>  else
>>  {
>>     offset = (char*)&(a.x) - (char*)&a;
>>  }
>>
>>  for(int i = 0; i < count; ++i)
>>  {
>>         int value = *(int*)((char*)a + offset);
>>  }
>> }
>>
>>
>> Is this approach valid at all? The compiler doesn't show any problem,
>> but I wonder if there can be any caveats related to structure aligning
>> etc.? It seems like it should not be a problem, because I am measuring
>> the offset in run time, but I am not quite sure...
>>
>> I also thought about using a function pointer to switch between two
>> tiny functions, one of them returning x and the other y from a given
>> struct instance, but it seems somewhat more expensive than the above
>> approach (push/pop param from stack, call, return)
>>
>> Thanks a lot!
>> _______________________________________________
>>
>> Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)
>>
>> Please do not post admin requests or moderator comments to the list.
>> Contact the moderators at cocoa-dev-admins(at)lists.apple.com
>>
>> Help/Unsubscribe/Update your Subscription:
>> http://lists.apple.com/mailman/options/cocoa-dev/muravievd%40gmail.com
>>
>> This email sent to muravi...@gmail.com
>
> Best regards,
>
> Dmitry Muraviev
> Software Engineer
> Vidau Systems
>
>
_______________________________________________

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com

Reply via email to