Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.64
Ultrator
11 / 7 / 1
Регистрация: 28.04.2009
Сообщений: 219
#1

Переменная в register, операция >>, во что компилится? - C++

30.04.2009, 10:49. Просмотров 1371. Ответов 11
Метки нет (Все метки)

Если объявлена переменная
C++
1
register unsigned int i=100;
и затем мне надо выполнять операцию >>1 (деление на 2), в цикле,
дак вот, если написать просто
C++
1
i=i>>1;
эта строка скомпилится именно в
Assembler
1
sar xX, 1
,
или какую-то более сложную последовательность, с присваиванием и т.д. ??
(Просто, i++ будет инкремент, а i>>1 - ничего не будет, значение i останется прежним. А как надо?)
Заранее благодарю.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Monte-Cristo
2786 / 1372 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
30.04.2009, 10:58     Переменная в register, операция >>, во что компилится? #2
всмысле?
C++
1
2
3
register unsigned int i=100;
i = i>>1;
cout << i;
у нас i теперь будет равно 50.

Добавлено через 3 минуты 1 секунду
вообще-то, во что она будет компилится - зависит от компилятора, насколько я знаю... возможно, все компиляторы и компилят в одно и тоже, но это не факт... компилятор производит оптимизацию и минимазацию.. поэтому после компилирования, сложно угадать. Сделайте дизасм свое программы, и посмотите.
Humanitis
172 / 164 / 6
Регистрация: 12.01.2009
Сообщений: 430
30.04.2009, 10:59     Переменная в register, операция >>, во что компилится? #3
Сначала значение запишется в регистр, потом операция сдвига, потом из регистра обратно в ячейку памяти
Тоже самое если написать
C++
1
i>>=1;
Ultrator
11 / 7 / 1
Регистрация: 28.04.2009
Сообщений: 219
30.04.2009, 11:17  [ТС]     Переменная в register, операция >>, во что компилится? #4
у нас i теперь будет равно 50
Ну с этим даже вопросов нет, это понятно.
Вопрос, это будет 1-на инструкция или несколько (эффективность кода, только, меня интересует).
i>>=1;
О, классно. Не знал что так можно. Наверно это и есть то что было надо.
Компилятор g++, без опций. (Переменная i ВСЕГДА в регистре, поскольку объявлена как register, и существует внутри блока.)
Кто нибудь знает конкретнее ?
Humanitis
172 / 164 / 6
Регистрация: 12.01.2009
Сообщений: 430
30.04.2009, 11:32     Переменная в register, операция >>, во что компилится? #5
Цитата Сообщение от Ultrator Посмотреть сообщение
Переменная i ВСЕГДА в регистре
С чего бы вдруг?
Это если будет свободный регистр в данном блоке,а если не будет то переменная разместится в ячейке памяти. И это логично. А вдруг я объявлю подобных перемнных больше ,чем регистров общего назначения
Ultrator
11 / 7 / 1
Регистрация: 28.04.2009
Сообщений: 219
30.04.2009, 13:27  [ТС]     Переменная в register, операция >>, во что компилится? #6
А если их в каждом блоке не > 4 ?
(Ну, AX всяко будет использоваться другими командами, BX м.б. тоже, ну, не знаю. Я почему то решил, не > 4-х, и ладно - может ли это гарантировать, что не выкинут?
Или может это всё ерунда (и стараться оптимизировать - вообще не нужно, т.к. всё равно)?)
CheshireCat
Эксперт С++
2891 / 1240 / 78
Регистрация: 27.05.2008
Сообщений: 3,340
30.04.2009, 13:35     Переменная в register, операция >>, во что компилится? #7
Тебе, как разработчику на Си/Си++, это без разницы. Ключевое слово register - это всего лишь нижайшая просьба к компилятору: "Ваше Святейшество, будьте любезны, попытайтесь разместить вот эту переменную в регистре, коли получится, ну а коли нет - мы, холопы Ваши, претензиев не имеем". И компилятор имеет полное право эту просьбу в любой момент проигнорировать.

Поверь, компиляторы пишут ну ооооочень неглупые люди, и оптимизировать сгенерированный компилятором код по времени исполнения (типа -O3) они умеют. Не факт, что тебе (или вообще среднему прикладному программисту) удастся это лучше, - тем более, что код, сгенерированный современными компиляторами, очень и очень неплох. Скорее всего, получится намного хуже.
Ultrator
11 / 7 / 1
Регистрация: 28.04.2009
Сообщений: 219
30.04.2009, 14:33  [ТС]     Переменная в register, операция >>, во что компилится? #8
Понятно. (а зачем тогда вообще это слово ?)
Вот, счётчики циклов после компиляции "-O3" - будут все в регистрах (если вложенность циклов не >3), или сложно сказать?

Вообще, где можно посмотреть примеры кода C++, который с буковкой O3 выдаёт максимально быстрый (или считающийся таковым) код ?
Пусть это будут хотя бы сортировки или т.п. (под любой 32-битный стандарт, кстати, сравнить под g++ и VC++ было бы интересно).

(Ведь учебников ПО ОПТИМИЗАЦИИ - НЕТ в принципе, а то что есть, там - тривиальные истины, то что все и так понимают).

Сайт Пита И..си - вот пожалуй и всё, что удалось найти мне (там, ессно, на английском). Оптимизация для MFC. Зашибись...
CheshireCat
Эксперт С++
2891 / 1240 / 78
Регистрация: 27.05.2008
Сообщений: 3,340
30.04.2009, 14:38     Переменная в register, операция >>, во что компилится? #9
Слово это осталось как рудимент ранних (ДОС-)компиляторов, когда оптимизировать приходилось вручную.
Посмотреть примеры кода? Да лехко. Напиши любой пример, и откомпилируй его в Release с оптимизацией. И VC++, и GCC умеют выдавать ассемблерные листинги кода (посмотри в документации) с привязкой листинга к исходного строкам кода. Другие компиляторы, видимо, тоже; просто именно с этими работаю постоянно и точно знаю. Наслаждайся!
Ultrator
11 / 7 / 1
Регистрация: 28.04.2009
Сообщений: 219
30.04.2009, 17:51  [ТС]     Переменная в register, операция >>, во что компилится? #10
Как в Линуксе посмотреть асм-код (и данные) elf-файла? (Есть ли такая прога ?).
CheshireCat
Эксперт С++
2891 / 1240 / 78
Регистрация: 27.05.2008
Сообщений: 3,340
30.04.2009, 18:25     Переменная в register, операция >>, во что компилится? #11
IDA, например.
А если это твой код - то все проще, используй ключик -S компилятора. Подробности в мануале по GCC или по ключику --help.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.04.2009, 20:29     Переменная в register, операция >>, во что компилится?
Еще ссылки по теме:

Условие того, что переменная не инициализирована C++
C++ Что делает операция new?
Что делает операция >>? C++
Не заполняется переменная по ссылке. Что не так? C++
C++ Объяснить, что делает операция *& и чем она отличается от простого указателя?

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Ultrator
11 / 7 / 1
Регистрация: 28.04.2009
Сообщений: 219
30.04.2009, 20:29  [ТС]     Переменная в register, операция >>, во что компилится? #12
Кто говорит - не знает,
Кто знает - не говорит (а делает).

Лао Цзы.
Yandex
Объявления
30.04.2009, 20:29     Переменная в register, операция >>, во что компилится?
Ответ Создать тему
Опции темы

Текущее время: 11:56. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru