#1
|
|||
|
|||
kernel compiling
Vasya Kruglov написал(а) к Aleksey Cheusov в Dec 02 20:28:36 по местному времени:
Привет тебе, матерый человечище Aleksey! Сpд Ноя 20 2002 14:53, Aleksey Cheusov -> Vitaly.Lugovsky@ontil.ihep.su: AC> Вот у меня icc под рукой нет - проверить не могу, но MSVC по этому AC> коду AC> int main () AC> { AC> int sum = 0; AC> for (int i=0; i < 5; ++i){ AC> for (int i=0; i < 15; ++i){ AC> ++sum; AC> } AC> } AC> return sum; AC> } AC> сгенерил вот это AC> _main: AC> 00401000 mov eax,4Bh AC> 00401005 ret Хм. Прошу прощения, но разве после завершения работы данного куска кода sum не будет равно 15? Второй цикл выполнится 15 раз, по его завершению sum=15; i=15 и происходит выход из внешнего цикла. Или здесь опечатка и во внутреннем цикле используется переменная j? Мяу! Я не утверждаю, что вышенаписанное соответствует действительности. Vasya Kruglov AKA zpt. zpt(at)rambler.ru --- GoldED+/386 1.1.1.2 |
#2
|
|||
|
|||
Re: kernel compiling
Valentin Nechayev написал(а) к Vasya Kruglov в Dec 02 17:57:10 по местному времени:
From: Valentin Nechayev <netch@segfault.kiev.ua> >>> Vasya Kruglov wrote: AC>> Вот у меня icc под рукой нет - проверить не могу, но MSVC по этому AC>> коду AC>> int main () AC>> { AC>> int sum = 0; AC>> for (int i=0; i < 5; ++i){ AC>> for (int i=0; i < 15; ++i){ AC>> ++sum; AC>> } AC>> } AC>> return sum; AC>> } AC>> сгенерил вот это AC>> _main: AC>> 00401000 mov eax,4Bh AC>> 00401005 ret VK> Хм. Прошу прощения, но разве после завершения работы данного куска кода sum не VK> будет равно 15? Второй цикл выполнится 15 раз, по его завершению sum=15; i=15 и VK> происходит выход из внешнего цикла. Или здесь опечатка и во внутреннем цикле VK> используется переменная j? Какая разница? Первый приступ оптимизации выкинет любые действия над переменной sum по той причине, что их результат не используется. Последующие удалят сначала внутренний цикл, потом внешний, и в результате останется пустое тело функции. Какие там переменные - уже пофиг. -netch- --- ifmail v.2.15dev5 |
#3
|
|||
|
|||
Re: Re: kernel compiling
Alexandr S. Agranovsky написал(а) к Valentin Nechayev в Dec 02 18:34:10 по местному времени:
From: "Alexandr S. Agranovsky" <llb@udmnet.ru> Нi, Valentin Nechayev VN> AC>> for (int i=0; i < 5; ++i){ VN> AC>> for (int i=0; i < 15; ++i){ ... VK>> происходит выход из внешнего цикла. Или здесь опечатка и во внутреннем цикле VK>> используется переменная j? VN> Какая разница? Первый приступ оптимизации выкинет любые действия над переменной VN> sum по той причине, что их результат не используется. Последующие удалят VN> сначала внутренний цикл, потом внешний, и в результате останется пустое VN> тело функции. Какие там переменные - уже пофиг. Соль в том, что после первого for имеем составной оператор {}, внутри которого можно заново определить переменную с тем же именем - но фактически это будет уже другая переменная. Все согласно правилам Си и C++ (я скомипилил и проверил, как .c так и .cpp, с ключом -O0). Оптимизатор тут ни при чем. - --- Alexandr S. Agranovsky llb@udmnet.ru --- ifmail v.2.15dev5 |
#4
|
|||
|
|||
kernel compiling
Slawa Olhovchenkov написал(а) к Valentin Nechayev в Dec 02 20:59:50 по местному времени:
Нello Valentin! 31 Dec 02, Valentin Nechayev writes to Vasya Kruglov: AC>>> Вот у меня icc под рукой нет - проверить не могу, но MSVC по этому AC>>> коду AC>>> int main () AC>>> { AC>>> int sum = 0; AC>>> for (int i=0; i < 5; ++i){ AC>>> for (int i=0; i < 15; ++i){ AC>>> ++sum; AC>>> } AC>>> } AC>>> return sum; AC>>> } AC>>> сгенерил вот это AC>>> _main: AC>>> 00401000 mov eax,4Bh AC>>> 00401005 ret VK>> Хм. Прошу прощения, но разве после завершения работы данного куска кода VK>> sum не будет равно 15? Второй цикл выполнится 15 раз, по его завершению VK>> sum=15; i=15 и происходит выход из внешнего цикла. Или здесь опечатка и VK>> во внутреннем цикле используется переменная j? Зависит от версии стандарта C++ по которой считаются области видимости. По старой 75, по новой 15. VN> Какая разница? Первый приступ оптимизации выкинет любые действия над VN> переменной sum по той причине, что их результат не используется. VN> Последующие удалят сначала внутренний цикл, потом внешний, и в результате VN> останется пустое тело функции. Какие там переменные - уже пофиг. ??? Не рано ль праздновать начал? ... Ну вот, я так и знала... --- GoldED+/BSD 1.1.5 |
#5
|
|||
|
|||
Re: kernel compiling
Valentin Nechayev написал(а) к \"Alexandr S. Agranovsky\" в Dec 02 22:22:28 по местному времени:
From: Valentin Nechayev <netch@segfault.kiev.ua> >>> Alexandr S. Agranovsky wrote: VN> AC>>> for (int i=0; i < 5; ++i){ VN> AC>>> for (int i=0; i < 15; ++i){ ASA> ... VK>>> происходит выход из внешнего цикла. Или здесь опечатка и во внутреннем цикле VK>>> используется переменная j? ASA> Соль в том, что после первого for имеем составной оператор {}, Возражение шло на пример, где оптимизация убила внутренний цикл в 0. ASA> внутри которого можно заново определить переменную с тем же ASA> именем - но фактически это будет уже другая переменная. ASA> Все согласно правилам Си и C++ (я скомипилил и проверил, как .c ASA> так и .cpp, с ключом -O0). Да??? Для Си это прокатывать никак не должно, что у меня и происходит: 20:21:21:netch@iv:~/tmp>gcc -c t.c t.c: In function `main': t.c:4: syntax error before `int' t.c:4: `i' undeclared (first use in this function) t.c:4: (Each undeclared identifier is reported only once t.c:4: for each function it appears in.) t.c:4: syntax error before `)' t.c:5: syntax error before `)' 20:21:27:netch@iv:~/tmp>gcc -v Using builtin specs. gcc version 2.95.4 20020320 [FreeBSD] А вот для C++ действительно может работать: 20:18:04:netch@iv:~/tmp>gcc -c -xc++ t.c 20:18:29:netch@iv:~/tmp>echo $? 0 Так что я тебе рекомендую 1) тщательно проверить, что ты действительно компилировал это как программу на C, а не на C++, 2) в этом случае назвать компилятор, чтобы я никогда им не пользовался ;)) ASA> Оптимизатор тут ни при чем. Ты точно потерял контекст. Вот максимум что я смог добиться от 2.95.4: main: pushl %ebp movl %esp,%ebp xorl %eax,%eax xorl %edx,%edx .p2align 2,0x90 .L6: incl %edx movl $14,%ecx .p2align 2,0x90 .L10: incl %eax decl %ecx jns .L10 cmpl $4,%edx jle .L6 movl %ebp,%esp popl %ebp ret А ICC оказался умнее, он сразу дал готовый результат. -netch- --- ifmail v.2.15dev5 |
#6
|
|||
|
|||
Re: kernel compiling
Valentin Nechayev написал(а) к Slawa Olhovchenkov в Jan 03 01:07:50 по местному времени:
From: Valentin Nechayev <netch@segfault.kiev.ua> >>> Slawa Olhovchenkov wrote: VN>> Какая разница? Первый приступ оптимизации выкинет любые действия над VN>> переменной sum по той причине, что их результат не используется. VN>> Последующие удалят сначала внутренний цикл, потом внешний, и в результате VN>> останется пустое тело функции. Какие там переменные - уже пофиг. SO> ??? Не рано ль праздновать начал? Вполне вовремя ;))) -netch- --- ifmail v.2.15dev5 |
#7
|
|||
|
|||
Re: Re: kernel compiling
Alexandr S. Agranovsky написал(а) к Valentin Nechayev в Jan 03 02:39:52 по местному времени:
From: "Alexandr S. Agranovsky" <llb@udmnet.ru> Нi, Valentin Nechayev VN>> AC>>> for (int i=0; i < 5; ++i){ VN>> AC>>> for (int i=0; i < 15; ++i){ ASA>> ... VK>>>> происходит выход из внешнего цикла. Или здесь опечатка и во внутреннем цикле VK>>>> используется переменная j? ASA>> Соль в том, что после первого for имеем составной оператор {}, VN> Возражение шло на пример, где оптимизация убила внутренний цикл в 0. мы говорим об оптимизации (было) или (уже) об различии переменных внутри составных операторов? ASA>> внутри которого можно заново определить переменную с тем же ASA>> именем - но фактически это будет уже другая переменная. ASA>> Все согласно правилам Си и C++ (я скомипилил и проверил, как .c ASA>> так и .cpp, с ключом -O0). VN> Да??? Для Си это прокатывать никак не должно, что у меня и происходит: VN> 20:21:21:netch@iv:~/tmp>gcc -c t.c VN> t.c: In function `main': VN> t.c:4: syntax error before `int' VN> t.c:4: `i' undeclared (first use in this function) VN> t.c:4: (Each undeclared identifier is reported only once VN> t.c:4: for each function it appears in.) VN> t.c:4: syntax error before `)' VN> t.c:5: syntax error before `)' VN> 20:21:27:netch@iv:~/tmp>gcc -v VN> Using builtin specs. VN> gcc version 2.95.4 20020320 [FreeBSD] Я признаюсь в том, что малость подкорректировал программку (не изменив сути определений по области видимости: int sum; int i; for (i=0;i<5;i) { int i; for (i=0;i<15;++i) {++sum;} } VN> А вот для C++ действительно может работать: VN> 20:18:04:netch@iv:~/tmp>gcc -c -xc++ t.c VN> 20:18:29:netch@iv:~/tmp>echo $? VN> 0 VN> Так что я тебе рекомендую 1) тщательно проверить, что ты действительно VN> компилировал это как программу на C, а не на C++, Да, я компилировал именно как Си - в первый раз меня точно так же обругали, тогда я вынес int i за пределы цикла и получил тот же самый результат (75) VN> 2) в этом случае назвать VN> компилятор, чтобы я никогда им не пользовался ;)) ;) Я ошибку допустил - сразу не привел текст, который скормил gcc'у - а он действительно отличался (буквами, но не смыслом) ASA>> Оптимизатор тут ни при чем. VN> Ты точно потерял контекст. Вот максимум что я смог добиться от 2.95.4: VN> main: VN> pushl %ebp VN> movl %esp,%ebp VN> xorl %eax,%eax VN> xorl %edx,%edx VN> .p2align 2,0x90 VN> .L6: VN> incl %edx VN> movl $14,%ecx VN> .p2align 2,0x90 VN> .L10: VN> incl %eax VN> decl %ecx VN> jns .L10 VN> cmpl $4,%edx VN> jle .L6 VN> movl %ebp,%esp VN> popl %ebp VN> ret Да, я тоже получил подобный код от 2.95.2 из Debian 2.2 VN> А ICC оказался умнее, он сразу дал готовый результат. С оптимизацией-то понятно, я хотел VK'у объяснить, что переменные "i" в обоих циклах разные. - --- Alexandr S. Agranovsky llb@udmnet.ru --- ifmail v.2.15dev5 |