Visual studio 2005

Тема в разделе "LANGS.C", создана пользователем _s4, 7 май 2007.

  1. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    _s4

    Не совсем понял зачем отдельный поток.

    __cdecl сам выравнивает стек после вызова функции, т.к. он знает на момент инстанцирования вызова количество переданных параметров. На С++ вообще не получится __stdcall сделать с произвольным числом параметров без хаков. Мой предыдущий пост относится к случаю когда ты сам можешь манипулировать стеком.
     
  2. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    _s4
    Можно узнать, о каких утечках речь?
     
  3. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Видимо о вздутии стека)
     
  4. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    _DEN_
    Вряд ли... stdcall и cdecl вздувают стек одинаково. Единственно, что при cdecl очистка стека чуть запаздывает.
    Мне кажется, _s4 хотел сэкономить на размере кода, т.е. на инструкции add esp, <args size>.
    Вряд ли искусственный stdcall обойдётся дешевле 3-х байт. :derisive:
     
  5. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    green

    Я имею ввиду что речь идет о wsprintf("%d", 10, 10); т.е. когда передали параметров больше чем откатили стек.
     
  6. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    _DEN_
    Компилятор сам откатит, сколько положил. Как раз cdecl здесь является залогом правильной очистки стека.
     
  7. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    green

    Ну так а я-то о __stdcall :derisive:
     
  8. _s4

    _s4 New Member

    Публикаций:
    0
    Регистрация:
    24 окт 2006
    Сообщения:
    58
    Извиняюсь был не прав :) На мгновение, с перепугу показалось, что этот код почему то стек от параметров не очищает =))
     
  9. _s4

    _s4 New Member

    Публикаций:
    0
    Регистрация:
    24 окт 2006
    Сообщения:
    58
    Ещё обратил внимание (с оптимизицией по скорости /O2 и с /Ox) если примерно вот такой код на си:
    Код (Text):
    1. /* Вообщем то самое важное...
    2. */
    3. char buffer[40];
    4. int a = 10;
    5.  
    6.     memset(buffer,'\0',40);  // ... вот тут, если заполянешь буфер, <= 40 байт...
    7.     wsprintf(buffer,"%d",a);
    8.  
    9. /*...то вот такой код компилятор генерирует:
    10. .text:0040100E                 xor     eax, eax
    11. .text:00401010                 push    0Ah
    12. .text:00401012                 mov     [esp+4], eax
    13. .text:00401016                 mov     [esp+8], eax
    14. .text:0040101A                 mov     [esp+0Ch], eax
    15. .text:0040101E                 mov     [esp+10h], eax
    16. .text:00401022                 mov     [esp+14h], eax
    17. .text:00401026                 mov     [esp+18h], eax
    18. .text:0040102A                 mov     [esp+1Ch], eax
    19. .text:0040102E                 mov     [esp+20h], eax
    20. .text:00401032                 mov     [esp+24h], eax
    21. .text:00401036                 mov     [esp+28h], eax
    22. .text:0040103A                 lea     eax, [esp+4]
    23. .text:0040103E                 push    offset asc_402044 ; "%"
    24. .text:00401043                 push    eax
    25. .text:00401044                 call    ds:__imp__wsprintfA
    26. */
    Мне очень интересно, неужели такой код работает быстрее, чем например простые строковые инструкции типа stos итд ?
     
  10. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    конечно.
    rep stos медленнее чем последовательные mov'ы.