+ Ответить в теме
Показано с 1 по 7 из 7

Тема: С++ disasm vs C# disasm

  1. #1
    emot
    Гость

    С++ disasm vs C# disasm

    Вот решил написать в этом разделе хоть одну темку. На asm-е давненько уже не кодирую, разве что для сверх оптимизации с приминением MMX, SSE и 3DNow!. Почему сверх? Да потому, что самая эффективная оптимизация - это оптимизация алгоритма. Но ближе к теме: недавно я столкнулся с такой вот интересной интерпретацией одного и того же тестового кода, но на разных языках:
    Код:
     
    int i = 2;
    int res = ++i + i++;
    
    Результат этого кода на C# 2.0 с компилятором MS csc:
    res = 7

    Резульат на C++ 8.0 с родным компилятором от MS:
    res = 8 !!!

    В чем же дело? Дизассемблируем и посмотрим:

    C++:
    Код:
    mov edi, 2
    inc edi 
    inc edi 
    lea eax, [edi+edi]   ; Любопытно. Складываются два указателя!
    mov ebp, eax
     
    C#:
    Код:
    mov esi,2 
    inc esi
    mov edi,esi 
    inc esi 
    add edi,esi 
    mov ebx,edi  
    И кто здесь прав?
    Последний раз редактировалось emot; 10.08.2007 в 14:10.

  2. #2
    Администратор
    Регистрация
    03.11.2005
    Адрес
    Киев
    Сообщений
    184
    Мои 2005 и 2003 студии единоголосно проголосовали за ответ 6 :laughing:
    А вот кто прав, сказать не могу )) Да и подобных конструкций я в коде не использую, ибо они напрягают..

  3. #3
    emot
    Гость
    Все дело в том, что результат такой конструкции не определен, т.е. каждый компилятор будет по своему компилировать такой код. Это кстате касаеться и извращенного свапа:
    b ^= a ^= b ^= a

    см. статью http://en.wikipedia.org/wiki/Sequence_point. Она немного проясняет эту ситуацию.

  4. #4
    Администратор
    Регистрация
    02.10.2007
    Адрес
    Харьков
    Сообщений
    73
    кстати если посмотреть по внимательней на приведенный выше асемблерный код, то можно заметить, что в С++ варианте компилер произвел попытку оптимизации.
    Там где комментарий "; Любопытно. Складываются два указателя!" мы видим что сложение содержимого двух регистров запихивается в другой регистр всего одной командой
    Код:
    lea eax, [edi+edi]
    
    , в отличие от C# компилятора. Очень это занимательно =)

    Кстати в 2003 VS у меня 6
    crazy programmer
    1: int 3
    dec %%edi
    jnz 1b

    -----------------------------
    http://3d-orange.com.ua

  5. #5
    Konstantyn
    Гость

    Сообщение

    Не представляю, как ты получил такие результаты. Компилятор интерпретирует выражения слева-направо, ты использовал два типа инкремента пост- и пре-, сначала преинкремент, соотвественно увеличивается значение i, потом вычисляется выражение. Ты получаеш нечто наподобии:
    i=i+1;
    res = i+i;
    i=i+1.

    res==6

    При включенной оптимизации, космпилятор может изменить последовательность вычислений выражения и ты получишь что-то типа:
    i=(i++) + (++i);

    Здесь уже результат будет равным 5.

  6. #6
    emot
    Гость

    Стрелка

    ЦитатаСообщение от Konstantyn Посмотреть сообщение
    Не представляю, как ты получил такие результаты.
    Ну давай разберемся:

    mov edi, 2 ; i = 2
    inc edi ; i = 3
    inc edi ; i = 4
    lea eax, [edi+edi] ; res = i + i = 4 + 4 = 8
    mov ebp, eax

    Все верно:)

  7. #7
    Администратор
    Регистрация
    02.10.2007
    Адрес
    Харьков
    Сообщений
    73
    Чтобы закончить споры давайте представим себя компилятором строго следующим стандарту :)
    итак, имеем код
    Код:
    int i = 2;
    int res = ++i + i++;
    
    поехали!
    1) Инициализируем i значением 2
    2) Видим преинкремент и приплюсовываем i единицу, имеем i == 3
    3) Видим сложение и постинкремент, но на то он и пост чтобы быть после, и производим сложение, i + i (3+3) == 6
    4) Записываем значение 6 в res и плюсуем к i единицу.

    Итого: res == 6, i == 4.

    А вообще, такой код следует избегать, и я всегда стараюсь помочь компилятору лучше меня понять, ведь тогда он сгенерирует лучший код. Помогайте своему компилятору и он поможет вам :)
    crazy programmer
    1: int 3
    dec %%edi
    jnz 1b

    -----------------------------
    http://3d-orange.com.ua

+ Ответить в теме

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

 

Социальные закладки

Социальные закладки
  • Digg
  • Google
  • Yandex.Закладки

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения