struct _string
{
char *b;
char *e;
} lines[10];
int main(void)
{
int i;
i=0;
while (i<10)
{
lines.e=0;
//Что соответствует ассемблерному коду (при отладке в C++ Builder'e)
//xor ecx,ecx
//mov [edx*8+lines+0x04],ecx
i++;
}
return 0;
}
Счётчик цикла или временная переменная?
Код:
или такая:
Код:
struct _string
{
char *b;
char *e;
} lines[10];
int main(void)
{
struct _string *ps1, *ps2;
ps1=lines;
ps2=&lines[9];
while (ps1<=ps2)
{
ps1->e=0;
//Что соответствует ассемблерному коду
//xor ecx,ecx
//mov [edx+0x04],ecx
ps1++;
}
return 0;
}
{
char *b;
char *e;
} lines[10];
int main(void)
{
struct _string *ps1, *ps2;
ps1=lines;
ps2=&lines[9];
while (ps1<=ps2)
{
ps1->e=0;
//Что соответствует ассемблерному коду
//xor ecx,ecx
//mov [edx+0x04],ecx
ps1++;
}
return 0;
}
Я не очень хорошо разбираюсь в ассемблере, но мне кажется, что операция "mov [edx*8+lines+0x04],ecx" представляет на самом деле несколько операций, причём умножение должно занимать относительно много процессорного времени, поэтому второй вариант предпочтительнее.
Кто как считает?
В обоих случаях инcтрукции mov - типа mov m32,r32 и требуют 1 микрооперацию.
Но первый вариант читабельнее, поэтому я голосую за него.
Код:
for (int i = sizeof (lines) / sizeof (string); i > 0; i--)[INDENT]lines .e = NULL
[/INDENT]
[/INDENT]
Во-первых: существенно нагляднее :)
Во-вторых, гораздо меньше переменных, которые загромождают область видимости функции. А "i" нигде, кроме как внутри цикла не нужна, зачем ей существовать вне его:confused: .
В-третьих: сравнение числа с нулём выполняется быстрее, чем с другим числом (поправьте меня, если я не прав;) )