Задание собственного типа функции

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by gevara, 22 Jul 2008.

  1. gevara

    gevara Elder - Старейшина

    Joined:
    29 Nov 2006
    Messages:
    47
    Likes Received:
    7
    Reputations:
    5
    Я вот думаю - можно ли заставить VC понимать другие соглашения о вызове функций. Вот, скажем, борланд понимает соглашение __fastcall по-своему и передаёт параметры в регистрах eax, ecx. Visual передаёт в ecx и edx.

    можно ли как-то описать свой тип (__mycall) и передавать параметры так, как я хочу? хочу, например, передавать параметры в регистрах eax, ecx, edx, остальные в стеке.

    может быть меня и глючит, но в x64 это становится довольно актуально, т.к. регистров уже 16. Описывая своё соглашение можно вообще забыть о стеке при передаче параметров..
     
  2. Delimiter

    Delimiter Banned

    Joined:
    8 Apr 2005
    Messages:
    317
    Likes Received:
    173
    Reputations:
    12
    обычно не парятся через глобальные переменные!
     
    #2 Delimiter, 22 Jul 2008
    Last edited: 22 Jul 2008
  3. gevara

    gevara Elder - Старейшина

    Joined:
    29 Nov 2006
    Messages:
    47
    Likes Received:
    7
    Reputations:
    5
    что...? при чём здесь глобальные переменные?
     
  4. izlesa

    izlesa Elder - Старейшина

    Joined:
    3 Jan 2008
    Messages:
    112
    Likes Received:
    32
    Reputations:
    5
    Delimiter наверно имел ввиду, что когда не устраивают стандартные соглашения, то используют глобальные переменные для передачи параметров.
     
  5. Delimiter

    Delimiter Banned

    Joined:
    8 Apr 2005
    Messages:
    317
    Likes Received:
    173
    Reputations:
    12
    .... именно так . Можно вообще со стеком не заморачиваться , пусть там лежит только адрес возврата!

    ...но Tc хочет узнать о внутренних средствах компайлера и линкера! Просто мой путь не как подняться в гору а как ее обойти!
     
  6. izlesa

    izlesa Elder - Старейшина

    Joined:
    3 Jan 2008
    Messages:
    112
    Likes Received:
    32
    Reputations:
    5
    интересно, а в каких случаях стандартные соглашения не подходят? не сталкивался с этим ещё.
    В принципе, ИМХО, не слишком эффективно передавать в функцию параметры через глобальные переменные. Через стэк проще и быстрее. Ну и ещё быстрее передача через регистры, но в свете их нехватки постоянной, стек из трёх оптимальнее всего.

    Хотя может я и ошибаюсь. Опыта пока маловато )
     
  7. gevara

    gevara Elder - Старейшина

    Joined:
    29 Nov 2006
    Messages:
    47
    Likes Received:
    7
    Reputations:
    5
    такс... товарищи. сдаётся мне стоит объяснить ещё раз.
    вот, скажем новая архитектура - x64: 16 64х (!!!) регистров. можно в регистрах передавать все параметры, а про стек забыть вообще. если, скажем, я пишу апликуху не под винду, то такой вариант очень даже разумен.
     
  8. Delimiter

    Delimiter Banned

    Joined:
    8 Apr 2005
    Messages:
    317
    Likes Received:
    173
    Reputations:
    12
    че за ботва??? Откуда ты узнаешь какие регистры и как использовал до этого компилятор! Иди нах на ассемблер и людям мозги фигней не забивай!!! Мля типа все окуенно низкоуровневые, только забывают что лабать нужно на ассемблере, а в ином случае компилятор будет использовать регистры сам, ты только можешь давать указания использовать переменную внутри функции как регистровую для резервации регистра!
     
  9. gevara

    gevara Elder - Старейшина

    Joined:
    29 Nov 2006
    Messages:
    47
    Likes Received:
    7
    Reputations:
    5
    как это откуда? вообще-то компилятор может быть увереным лишь в том, что функция не изменит регистров ebp, ebx, esi, edi (их она и сохраняет в стеке). надеяться на то, что остальные регистры не будут заюзаны функцией компилятор не может - почему бы не использовать оставшиеся регистры для передачи параметров. по сути дела - то же самое fastcall соглашение, просто более раширенное, с использованием всех регистров.