forum.wfido.ru  

Вернуться   forum.wfido.ru > Прочие эхи > RU.LINUX

Ответ
 
Опции темы Опции просмотра
  #1  
Старый 30.04.2021, 21:51
Vasya Kruglov
Guest
 
Сообщений: n/a
По умолчанию 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  
Старый 30.04.2021, 21:53
Valentin Nechayev
Guest
 
Сообщений: n/a
По умолчанию 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  
Старый 30.04.2021, 21:53
Alexandr S. Agranovsky
Guest
 
Сообщений: n/a
По умолчанию 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  
Старый 30.04.2021, 21:54
Slawa Olhovchenkov
Guest
 
Сообщений: n/a
По умолчанию 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  
Старый 30.04.2021, 21:54
Valentin Nechayev
Guest
 
Сообщений: n/a
По умолчанию 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  
Старый 30.04.2021, 21:54
Valentin Nechayev
Guest
 
Сообщений: n/a
По умолчанию 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  
Старый 30.04.2021, 21:54
Alexandr S. Agranovsky
Guest
 
Сообщений: n/a
По умолчанию 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
Ответить с цитированием
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


Текущее время: 23:39. Часовой пояс GMT +4.


Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2024, vBulletin Solutions, Inc. Перевод: zCarot