LINUX.ORG.RU

Автоматические переменные


0

0

Как заставить gcc создавать автоматические переменные регистрах а не в стеке?

for (int i=0; i<1000000000; i++) {}

тут лучше переменную держать в регистре. Есть ли какая специальная опция (общие опции оптимизации -О2 -О3 это делают но полная оптимизация ненужна)

anonymous

Ответ на: комментарий от dimon555

нет register непроходит во всяком случае если компилить g++ 4.3 версии. Ручками на ассемблере я и сам могу, а зачем тогда изобретали языки высокого уровня? Чтобы компиляторы быдлокод генерировали? Может мне нужна производительность без изврата (а оптимизация -О уже насилие над алгоритмом) что теперь на асме писать?

anonymous
()
Ответ на: комментарий от fopen

>Никак. И нужно ли это?

+1 Подобные оптимизации не нужны. По-моему, это мания у автора топика.

HappyCoder
()
Ответ на: комментарий от anonymous

> Может мне нужна производительность без изврата (а оптимизация -О уже насилие над алгоритмом) что теперь на асме писать?

Поясните фразу "Насилие над алгоритмом"

anonymous
()

> тут лучше переменную держать в регистре.

Далеко не всегда. Представим себе в теле цикла какие-то тяжёлые вычисления с множеством временных переменных, которые действительно лучше держать в регистрах, а i доставать только на время между выполнениями тела цикла для проверки условия и инкремента.

> общие опции оптимизации -О2 -О3 это делают но полная оптимизация ненужна

Отсюда делаем вывод -- в вашем случае оптимизация не нужна вообще, так как -O2 соптимизирует в теле цикла такие вещи, которые полностью перекроют выигрыш от выноса переменной в регистр.

register int i -- это просто подсказка компилятору, но он не обязан помещать i в регистр.

anonymous
()
Ответ на: комментарий от anonymous

> register int i -- это просто подсказка компилятору, 
но он не обязан помещать i в регистр.

Не совсем. Например,

#include <stdio.h>
int main(void)
{
   register int a[2];
   printf("%d\n",sizeof(a));
   return 0;
}

откомпилится, запустится, даст 8

А вот это:

#include <stdio.h>
int main(void)
{
   register int a[2];
   a[0]=1; a[2]= 2;
   printf("%d\n",a[1]+a[2]);
   return 0;
}

выругается: error: address of register variable 'a' requested

Die-Hard ★★★★★
()
Ответ на: комментарий от Die-Hard

Но всё равно переменная *в обоих случаях* может часть своей жизни провести не в регистре. Это просто ограничение register-переменных, что к ним неприменим оператор взятия адреса. Для всех регистровых переменных, как тех, которые действительно в регистре, так и тех, которые не попали в регистр.

anonymous
()
Ответ на: комментарий от anonymous

> Но всё равно переменная *в обоих случаях* может часть своей жизни провести не в регистре.

Да, конечно.

Я просто имел в виду, что register -- не просто мусорное слово, как иногда полагают.

Die-Hard ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.