знаех си аз че ще обини някой дизайна
значи аз вече го направих, само че много грозно за съжаление.
третирах си ги указателите като чисти поинтери, и наистина съм учуден че казваш че може и да не са. все пак адреса на функцията е просто адрес към който се скача. не съм пробвал с виртуални функции какво ще стане, ама те и без това не ме интересуват. но мисля че и с тях ще стане.
а за значи ще ти разкажа малко, както поиска, за да прецениш. фирмата в която работя, се занимава с направата на симулатори, технически представляващи нещо като компютърни игри. всички симулатори се изграждат на базата на обща платформа, като част от нея е системата която се грижи за разните динамични неща в сцената - хора, самолети, танкове, асансьори, врати, бе всичко що мърда. за целта ползваме развойна среда, с която описваме алгоритъма на поведението на въпросните неща. този алгоритъм се изпълнява върху виртуална машина, тоест кода му се интерпретира. тази развойна среда съм я правил аз, и все още я правя. конкретния повод е целта ми да добавя към развойната среда възможност за работа с инстанции на "native" С++ класове, да достъпвам мембърите им и да викам функциите им, да ги създавам и трия. вече го направих, за съжаление доста по-трудно отколкото си представях. как го направих - значи всеки реален С++ клас, който искам да направя видим за виртуалната машина, регистрирам в една структура. регистрирам основните му данни - размер, име, а също и мембърите които искам да виждам. променливите се регистрират със офсета си, а функциите се регистрират със адреса си и броя на аргументите които искат. в момента, това което ми дразни окото е че конструктора и деструктора се регистрират чрез отделен механизъм, понеже не мога да им взема адреса. също така ме дразни че механизма за регистрация на членфункция е грозен, заради това че thiscall не може да се каства към воид. ако това със reinterpret_cast което предлагаш бачка (не съм го пробвал още), то ще поизчисти малко нещата, ще ми съкрати малко регистрацията и кода ще изглежда по-строен. това че не мога да вземам конструктора има и втора лоша страна, която дори е по-важна. това че сега го правя с темплейт може да се преглътне - памет много, обаче сега нямам механизъм с който да мога да си избирам конструктора който искам да се изпълни. тоест изпълнявам винаги само конструктор без параметри.
общо взето това е, иначе си бачка. функциите ги викам на ниско ниво - със онлайн асемблера. мисля че конвенцията за викане на функции е стабилна, защото иначе дллките нямаше да бачкат. поне на функциите с 4байтови параметри, а аз само такива ползвам.
|