Вызов метода структуры через задницу

Тема в разделе "WASM.BEGINNERS", создана пользователем 6opoDuJIo, 12 окт 2011.

  1. 6opoDuJIo

    6opoDuJIo New Member

    Публикаций:
    0
    Регистрация:
    22 май 2009
    Сообщения:
    105
    Наверное,все присутствующие здесь знают,что к элементу структуры(C++,чистый,без clr и прочих) ,возможен "черезжопный" доступ в виде *(hstruc+sizeof(fieldN_type)). Собственно, вопрос:возможен ли подобный доступ к МЕТОДАМ структуры?если да,то насколько сложно реализуемо на плюсах/асме?
     
  2. karabas_barabas

    karabas_barabas Member

    Публикаций:
    0
    Регистрация:
    9 авг 2009
    Сообщения:
    168
    FIELD_OFFSET ?
     
  3. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    6opoDuJIo
    Это зависит от компилятора. Если говорить про MS cl, то он обычно помещает адрес таблицы методов в первый член объекта, т.е. обычно вызов первого метода выглядит вот так:

    mov eax, [ecx]
    call dword [eax]

    второго, соответственно:

    mov eax, [ecx]
    call dword [eax + 0x4]

    Но никто не может дать гарантий, закладываться на это нельзя. Если речь идет об известном коде, то лучше посмотреть в дизассемблере как там и что. В общем случае ничего не определено.
     
  4. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    к виртуальным. и лучше этот класс не оптимизировать, только отдельные места в функциях
     
  5. 6opoDuJIo

    6opoDuJIo New Member

    Публикаций:
    0
    Регистрация:
    22 май 2009
    Сообщения:
    105
    м...вот оно что,ну спасибо
    а нету ли каких-либо функций,которые бы позволили получить адрес таблицы методов при наличии ссылки на экземпляр класса?чтобы не завязыватся на компилятор
     
  6. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    1) Через таблицу vtable вызываются только виртуальные методы, а не-виртуальные - как обычные функции по фиксированному адресу\смещению, определеному на этапе компиляции\линковки

    2) Сишными стандартами способ вызова виртуальных ф-й никак не регламентирован и соотв-но в стандарте даже нет упоминания о vtable (если только вскользь в примечании), не говоря уже о каких-то функциях для получения ее адреса. Поэтому в общем случае "все зависит от компилятора". Однако если компилятор предусматривает возможность реализации COM-интерфейсов через абстрактные классы, то из соображений совместимости указатель на vtable должен быть первым членом класса и сама vtable должна содержать указатели на виртуальные методы в порядке их объявления (разумеется это справедливо, когда в базовом классе объявлен хотя бы один виртуальный метод).

    3) "Чтобы не завязыватся на компилятор" нужно еще и стандартную конвенцию вызова виртуальных методов явно указывать (stdcall или cdecl). Иначе компилятор может использовать свой нестандартный вызов по умолчанию, например, в MS VC _thiscall с передачей this через регистр ecx
     
  7. 6opoDuJIo

    6opoDuJIo New Member

    Публикаций:
    0
    Регистрация:
    22 май 2009
    Сообщения:
    105
    М.спасибо за столь развернутый ответ,вопросов больше нет
     
  8. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    можете еще при создании, в описателе сделать табличку нужных вам методов. макросами или еще чем, но с вызовами гемор будет точно, даже если прилепиться к компилятору. впрочем, и тут можно придумать ход. вопрос только стоит ли эта игра свечь?
     
  9. 6opoDuJIo

    6opoDuJIo New Member

    Публикаций:
    0
    Регистрация:
    22 май 2009
    Сообщения:
    105
    В общем то задача состояла в том,чтобы обращатся к методу по его номеру,ну и в довесок,с массивом параметров.а с макросами идея кстати.