14 / 10 / 1
Регистрация: 28.04.2009
Сообщений: 219
1

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

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

Author24 — интернет-сервис помощи студентам
Если объявлена переменная
C++
1
register unsigned int i=100;
и затем мне надо выполнять операцию >>1 (деление на 2), в цикле,
дак вот, если написать просто
C++
1
i=i>>1;
эта строка скомпилится именно в
Assembler
1
sar xX, 1
,
или какую-то более сложную последовательность, с присваиванием и т.д. ??
(Просто, i++ будет инкремент, а i>>1 - ничего не будет, значение i останется прежним. А как надо?)
Заранее благодарю.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.04.2009, 10:49
Ответы с готовыми решениями:

Игра морской бой.Можете объяснить операцию case что она делает ?И что означает переменная m3,m2,m1, и переменная z?
Листинг программы: var Form1: TForm1; i,j,g,x1,y1,k11,k21, k33,k32,k31,m3,m2,m1, //кол-во 3х 2х...

Behavior не компилится, не хватает конструктора. Объявляю, не компилится. Не пойму
В общем, такой вот код, но не компилируется. Что не так? Чёт не пойму вообще. /// <summary> ...

Замена register.php на /register
Здравствуйте, у меня появился новый вопрос: Как сделать так чтобы вместо register.php было...

Не компилится.Что не так?
#include <winsock2.h> #include <iostream> #include <stdio.h> #pragma comment (lib,"ws2_32.lib")...

11
2816 / 1407 / 107
Регистрация: 07.03.2009
Сообщений: 4,446
30.04.2009, 10:58 2
всмысле?
C++
1
2
3
register unsigned int i=100;
i = i>>1;
cout << i;
у нас i теперь будет равно 50.

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

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

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

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

Сайт Пита И..си - вот пожалуй и всё, что удалось найти мне (там, ессно, на английском). Оптимизация для MFC. Зашибись...
0
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
30.04.2009, 14:38 9
Слово это осталось как рудимент ранних (ДОС-)компиляторов, когда оптимизировать приходилось вручную.
Посмотреть примеры кода? Да лехко. Напиши любой пример, и откомпилируй его в Release с оптимизацией. И VC++, и GCC умеют выдавать ассемблерные листинги кода (посмотри в документации) с привязкой листинга к исходного строкам кода. Другие компиляторы, видимо, тоже; просто именно с этими работаю постоянно и точно знаю. Наслаждайся!
0
14 / 10 / 1
Регистрация: 28.04.2009
Сообщений: 219
30.04.2009, 17:51  [ТС] 10
Как в Линуксе посмотреть асм-код (и данные) elf-файла? (Есть ли такая прога ?).
0
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
30.04.2009, 18:25 11
IDA, например.
А если это твой код - то все проще, используй ключик -S компилятора. Подробности в мануале по GCC или по ключику --help.
1
14 / 10 / 1
Регистрация: 28.04.2009
Сообщений: 219
30.04.2009, 20:29  [ТС] 12
Кто говорит - не знает,
Кто знает - не говорит (а делает).

Лао Цзы.
0
30.04.2009, 20:29
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.04.2009, 20:29
Помогаю со студенческими работами здесь

Модульная переменная или блочная статическая переменная: что лучше
Переменная (тип String) нужна на всем протяжении работы программы. Нужен совет опытных - что...

Глобальная переменная определена в хидере. Компилятор ругается на то, что переменная переопределена несколько раз
Исходники: /* main.cpp */ #include &quot;hider.h&quot; int main(void) { return 0; } /* foo.cpp */

Не компилится код программы! ругается на объявление переменной - не могу разобраться что все таки нужно - чтоб работать стала
Программа делается в 6 Builder в консоли Задание в прикрепренном файле!!! и коды прогрмм во...

Syntax error в Register: <%@ Register TagPrefix="sb" Namespace="SB.WebControls" Assembly="SB.WebControls"%>
Народ, помогите плз. чего ему не нравиться? &lt;%@ Register TagPrefix=&quot;sb&quot; Namespace=&quot;SB.WebControls&quot;...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru