The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"registred int"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"registred int"  
Сообщение от Answer on 01-Сен-07, 05:41 
Насколько оправдано использование registred int по сравнению с auto int? Действительно это влияет на что-то, не остались ли это отзвуки прошлого?
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

 Оглавление

  • registred int, anonymous, 13:50 , 01-Сен-07, (1)  
    • registred int, qhdocyr, 22:49 , 01-Сен-07, (2)  
      • registred int, anonymous, 00:08 , 02-Сен-07, (3)  
    • registred int, dimonna, 15:37 , 05-Сен-07, (5)  
      • registred int, anonymous, 21:44 , 05-Сен-07, (6)  
        • registred int, dimonna, 21:54 , 05-Сен-07, (7)  
      • registred int, anonymous, 22:05 , 05-Сен-07, (8)  
        • registred int, dimonna, 09:24 , 06-Сен-07, (9)  
  • registred int, horsh, 21:18 , 02-Сен-07, (4)  

Сообщения по теме [Сортировка по времени, UBB]


1. "registred int"  
Сообщение от anonymous (??) on 01-Сен-07, 13:50 
>Насколько оправдано использование registred int по сравнению с auto int? Действительно это
>влияет на что-то, не остались ли это отзвуки прошлого?

Насколько я помню, gcc вообще игнорирует register.  И любой другой компилятор тоже имеет полное на это право, по стандарту.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

2. "registred int"  
Сообщение от qhdocyr email on 01-Сен-07, 22:49 
Чтобы быть уверенным, что функции используют регистры для переменной индекса (или какой-нибудь другой), давайте попробуем заставить компилятор по мере возможности делать это. Необходимо всегда помнить, что доступ к регистрам процессора во много раз быстрее, чем к оперативной памяти. Это происходит потому, что регистры находятся внутри ЦПУ, а память - нет. Мы можем использовать ключевое слово register, чтобы скомандовать компилятору использовать регистр. Как пример, напишем функцию, которая делает перестановку без регистров.
void Swap(int num_l,num_2)
{
int temp;
temp=num_1;
num_l=num_2; num_2=temp;
}
А теперь перепишем ее, используя регистр как временную переменную.

Swap(int num_1,num_2)
{
register int temp;
temp=num_1;
num_1=num_2;
num_2=temp;
}
Если компилятор может, то он будет использовать регистр в качестве регистровой переменной и программа увеличит скорость выполнения на 10-15 процентов. В связи с использованием ключевого слова register нужно учитывать два момента:
    Компилятор не создает регистры, он использует стандартные регистры ЦПУ;
    Иногда форсирование компилятора для использования регистров делает программу медленнее. Будьте осторожны. Обычно не стоит применять переменные типа register в маленьких функциях.
Теперь поговорим об основных приемах оптимизации компилятора.

Это цитата из книги. Можно попробывать загнать эти функции в длинный цикл и сравнить скорости.


Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

3. "registred int"  
Сообщение от anonymous (??) on 02-Сен-07, 00:08 
>void Swap(int num_l,num_2)
>{
>int temp;
>temp=num_1;
>num_l=num_2; num_2=temp;

Эта функция не делает _ничего_.  Хоть с register, хоть без.  Она тасует локальные переменные, которые исчезают при выходе из функции.  GCC её оптимизирует в ничто:

swap:
        pushl   %ebp
        movl    %esp, %ebp
        popl    %ebp
        ret
        .size   swap1, .-swap1

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

5. "registred int"  
Сообщение от dimonna email(ok) on 05-Сен-07, 15:37 
>>Насколько оправдано использование registred int по сравнению с auto int? Действительно это
>>влияет на что-то, не остались ли это отзвуки прошлого?
>
>Насколько я помню, gcc вообще игнорирует register.  И любой другой компилятор
>тоже имеет полное на это право, по стандарту.

Нет, Вы не правы:
      1 #include <stdio.h>
      2
      3 int main()
      4 {
      5     int a=5;
      6 }
дамп такой:
      1 not register
      2 Dump of assembler code for function main:
      3 0x08048384 <main+0>:    push   %ebp
      4 0x08048385 <main+1>:    mov    %esp,%ebp
      5 0x08048387 <main+3>:    sub    $0x8,%esp
      6 0x0804838a <main+6>:    and    $0xfffffff0,%esp
      7 0x0804838d <main+9>:    mov    $0x0,%eax
      8 0x08048392 <main+14>:   sub    %eax,%esp
      9
     10 0x08048394 <main+16>:   movl   $0x5,0xfffffffc(%ebp)
     11 0x0804839b <main+23>:   mov    $0x0,%eax
     12 0x080483a0 <main+28>:   leave
     13 0x080483a1 <main+29>:   ret
     14 0x080483a2 <main+30>:   nop
     15 0x080483a3 <main+31>:   nop
     16 0x080483a4 <main+32>:   nop
     17 0x080483a5 <main+33>:   nop
     18 0x080483a6 <main+34>:   nop
     19 0x080483a7 <main+35>:   nop
     20 0x080483a8 <main+36>:   nop
     21 0x080483a9 <main+37>:   nop
     22 0x080483aa <main+38>:   nop
     23 0x080483ab <main+39>:   nop
     24 0x080483ac <main+40>:   nop
     25 0x080483ad <main+41>:   nop
     26 0x080483ae <main+42>:   nop
     27 0x080483af <main+43>:   nop
     28 End of assembler dump.

      1 #include <stdio.h>
      2
      3 int main()
      4 {
      5     int a=5;
      6 }
дамп:
      1 register
      2 Dump of assembler code for function main:
      3 0x08048384 <main+0>:    push   %ebp
      4 0x08048385 <main+1>:    mov    %esp,%ebp
      5 0x08048387 <main+3>:    sub    $0x8,%esp
      6 0x0804838a <main+6>:    and    $0xfffffff0,%esp
      7 0x0804838d <main+9>:    mov    $0x0,%eax
      8 0x08048392 <main+14>:   sub    %eax,%esp
      9
     10 0x08048394 <main+16>:   mov    $0x0,%eax
     11 0x08048399 <main+21>:   leave
     12 0x0804839a <main+22>:   ret
     13 0x0804839b <main+23>:   nop
     14 0x0804839c <main+24>:   nop
     15 0x0804839d <main+25>:   nop
     16 0x0804839e <main+26>:   nop
     17 0x0804839f <main+27>:   nop
     18 End of assembler dump.

Соответственно, эксперимент:
      1 #include <stdio.h>
      2
      3 int main()
      4 {
      5     int a=5;
      6     for (a=0; a<1000000000; a++)
      7     {
      8         __asm__("nop");
      9     }
     10 }
time ./a.out

real    0m4.668s
user    0m4.162s
sys     0m0.013s

      1 #include <stdio.h>
      2
      3 int main()
      4 {
      5     register int a=5;
      6     for (a=0; a<1000000000; a++)
      7     {
      8         __asm__("nop");
      9     }
     10 }
time ./a.out

real    0m3.885s
user    0m3.571s
sys     0m0.025s

Получаем разницу 18%

gcc version 3.3.6

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

6. "registred int"  
Сообщение от anonymous (??) on 05-Сен-07, 21:44 
Какие опции оптимизации были включены?
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

7. "registred int"  
Сообщение от dimonna email(ok) on 05-Сен-07, 21:54 
>Какие опции оптимизации были включены?

Никаких естественно :)

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

8. "registred int"  
Сообщение от anonymous (??) on 05-Сен-07, 22:05 
На моей машине:

$ gcc --version
gcc (GCC) 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)

$ cat t.c
int main()
{
  register int a = 5;   <-------------------- register
  for (a=0; a<1000000000; a++)
  {
    __asm__("nop");
  }
}
$ gcc -S t.c    <----------------- без оптимизации
$ cat t.s

        .file   "t.c"
        .text
.globl main
        .type   main, @function
main:
        leal    4(%esp), %ecx
        andl    $-16, %esp
        pushl   -4(%ecx)
        pushl   %ebp
        movl    %esp, %ebp
        pushl   %ecx
        subl    $4, %esp
        movl    $0, -8(%ebp)
        jmp     .L2
.L3:
#APP
        nop
#NO_APP
        incl    -8(%ebp)
.L2:
        cmpl    $999999999, -8(%ebp)  <----------- стек
        jle     .L3
        addl    $4, %esp
        popl    %ecx
        popl    %ebp
        leal    -4(%ecx), %esp
        ret
        .size   main, .-main
        .ident  "GCC: (GNU) 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)"
        .section        .note.GNU-stack,"",@progbits

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

9. "registred int"  
Сообщение от dimonna email(ok) on 06-Сен-07, 09:24 
fuck, я немножко некорректную инфу дал - я это с помощью g++ делал а не gcc


g++ -v
Reading specs from /usr/lib/gcc-lib/i486-slackware-linux/3.3.6/specs
Configured with: ../gcc-3.3.6/configure --prefix=/usr --enable-shared --enable-threads=posix --enable-__cxa_atexit --disable-checking --with-gnu-ld --verbose --target=i486-slackware-linux --host=i486-slackware-linux
Thread model: posix
gcc version 3.3.6

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

4. "registred int"  
Сообщение от horsh (ok) on 02-Сен-07, 21:18 
>Насколько оправдано использование registred int по сравнению с auto int? Действительно это
>влияет на что-то, не остались ли это отзвуки прошлого?

Вот что говорит стандарт c99:

ISO/IEC 9899

6.5.3.2 Address and indirection operators

Constraints 1

The operand of the unary & operator shall be either a function designator, the result of a [] or unary * operator, or an lvalue that designates an object that is not a bit-field and is not declared with the register storage-class specifier.

6.7.1 Storage-class specifiers

4. A declaration of an identifier for an object with storage-class specifier register suggests that access to the object be as fast as possible. The extent to which such suggestions are effective is implementation-defined.101)

101) The implementation may treat any register declaration simply as an auto declaration. However, whether or not addressable storage is actually used, the address of any part of an object declared with storage-class specifier register cannot be computed, either explicitly (by use of the unary & operator as discussed in 6.5.3.2) or implicitly (by converting an array name to a pointer as discussed in 6.3.2.1). Thus, the only operator that can be applied to an array declared with storage-class specifier register is sizeof.


т.е. от регистровой переменной нельзя адрес брать.
А пожелание о быстром доступе к переменной больщинство
современных компиляторов игнорируют.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ] [Рекомендовать для помещения в FAQ]




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру