Что быстрее?

Discussion in 'WASM.BEGINNERS' started by na1s, Apr 19, 2007.

  1. na1s

    na1s New Member

    Blog Posts:
    0
    Что быстрее?

    char one='1';
    one-='0';

    или:

    char one='1';
    one-=48;
     
  2. censored

    censored New Member

    Blog Posts:
    0
    быстрее: char one = 1;
    а 1й и 2й code snippet не отличаются друг от друга.
     
  3. crypto

    crypto Active Member

    Blog Posts:
    0
    na1s
    Компилятор сгенерит один и тот же код.
     
  4. na1s

    na1s New Member

    Blog Posts:
    0
    Можете доказать? Очень надо доказать...
     
  5. wasm_test

    wasm_test wasm test user

    Blog Posts:
    0
    '0' и 48 это на самом деле одно и тоже : 48.
    код обоих частей будет одинаковый и примерно такой:
    Code (Text):
    1. mov al, 49
    2. sub al, 48
     
  6. n0name

    n0name New Member

    Blog Posts:
    0
    na1s
    Поставь опцию - генерировать асм-листинг, и убедись.
     
  7. na1s

    na1s New Member

    Blog Posts:
    0
    Олей ищу, там нет такого:
    mov al, 49
    sub al, 48
    , а насчет генерировать асм-листинг, я не знаю как?
     
  8. wasm_test

    wasm_test wasm test user

    Blog Posts:
    0
    Code (Text):
    1. int main( )
    2. {
    3.     char a = '1';
    4.     a -= '0';
    5.  
    6.     return 0;
    7. }
    транслируется в:
    жирным я выделил то, что тебя интересует.
    PUSH EBP / MOV EBP,ESP - создание фрейма стека (или кадра стека, как больше нравится)
    PUSH ECX - резервирование места под переменную
    По адресу SS:[EBP-4] хранится моя переменная a.
    MOV BYTE PTR SS:[EBP-4],31 присваивает ей значение 31h (49)
    MOV AL,BYTE PTR SS:[EBP-4] копирует временно переменную в регистр
    SUB AL,30 - вычитает из регистра 30h (48)
    MOV BYTE PTR SS:[EBP-4],AL записывает регистр обратно в переменную
    XOR EAX,EAX / MOV ESP, EBP / POP EBP / RETN return 0 с освобождением кадра стека

    Теперь ясно? '0' и 48 на самом деле различаются только компилятором, а в бинарном файле разницы не будет _НИКАКОЙ_.
     
  9. crypto

    crypto Active Member

    Blog Posts:
    0
    na1s
    Для компилятора '0' и 48 суть одна и та же константа (0х30 в 16-ричной записи).
     
  10. na1s

    na1s New Member

    Blog Posts:
    0
    спасибо
     
  11. diamond

    diamond New Member

    Blog Posts:
    0
    Great
    Вообще-то "push ecx" - это не сохранение ecx, а резервирование места под локальную переменную [ebp-4].
     
  12. wasm_test

    wasm_test wasm test user

    Blog Posts:
    0
    diamond
    эм ну да )
    я чето ступил.
     
  13. Ustus

    Ustus New Member

    Blog Posts:
    0
    crypto
    Не совсем :)
    '0' - типа char, а 48 - типа int.
     
  14. wasm_test

    wasm_test wasm test user

    Blog Posts:
    0
    Ustus
    для процессора в бинарнике точно все равно) точнее они даже и не отличаются ничем
     
  15. Ation

    Ation New Member

    Blog Posts:
    0
    #pragma inline - говорит компилятору сначала транслировать си в асм.
     
  16. cppasm

    cppasm New Member

    Blog Posts:
    0
    Дык это потому что компилятор не тупой :)
    Он просто сразу начальную константу поменял и всё.
    Вы же не ожидаете что при коде
    Code (Text):
    1. char c='1'-'0';
    будет сгенерировано вычитание...
     
  17. leo

    leo Active Member

    Blog Posts:
    0
    cppasm
    Как показал Great в #8 компилятор может быть еще тупее ;))
    А в Оле нужно искать не "sub al,48", а по крайней мере "sub R8,30" т.к. и регистр м.б. другим и числа Оля показывает в 16-ричном виде
     
  18. wasm_test

    wasm_test wasm test user

    Blog Posts:
    0
    Без оптимизации он этого не сделает.
     
  19. green

    green New Member

    Blog Posts:
    0
    leo
    Я уверен, что VC++ в режиме оптимизации такого кода сгенерировать не мог. Он вообще бы выбросил манипуляции с переменной а
    , сгенерировав:

    Code (Text):
    1. xor eax, eax
    2. ret
     
  20. wasm_test

    wasm_test wasm test user

    Blog Posts:
    0
    green
    а кто говорил про оптимизацию какую-либо?