-
Notifications
You must be signed in to change notification settings - Fork 14
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Вопросы по реализации - vtable и target #2
Comments
|
Вот оригинальный репозиторий, там автор тоже приводит пояснения: https://github.com/medigor/example-native-api-rs Хорошим примером будет реализация class IMemoryManager
{
public:
virtual ~IMemoryManager() {}
virtual bool ADDIN_API AllocMemory (void** pMemory, unsigned long ulCountByte) = 0;
virtual void ADDIN_API FreeMemory (void** pMemory) = 0;
};Получить представление VTable удобно на godbolt (https://godbolt.org/z/WGWa5E49M):
В rust переносим, вынеся все внутря в MemoryManagerVTable, т.к. : #[repr(C)]
struct MemoryManagerVTable {
dtor: usize,
#[cfg(target_family = "unix")]
dtor2: usize, // второй поинтер нужен только для имитации таблиц clang, а это случается только когда компилируем под unix
alloc_memory: unsafe extern "system" fn(&MemoryManager, *mut *mut c_void, c_ulong) -> bool,
free_memory: unsafe extern "system" fn(&MemoryManager, *mut *mut c_void),
}
#[repr(C)]
pub struct MemoryManager {
vptr: &'static MemoryManagerVTable,
}Я не могу найти, где прям четко написано это, но мое понимание такое, что 1С под виндой ждет скомпилированное только MSVC, а под linux соответственно clang или gcc ("In general, Clang is highly compatible with the GCC inline assembly extensions, allowing the same set of constraints, modifiers and operands as GCC inline assembly.") |
На сколько я помню, это в каком-то докладе говорилось техническом. По-моему в том, где рассказывали как потребление памяти анализируют. Там говорили, что они завязались на MSVC на винде и на gcс на лине. И ещё свой аллоктор используют, а не системный. |
|
https://docs.rs/vtable/latest/vtable/ Мне кажется для vtable'ов нужно посмотреть в сторону этого крейта. Уж очень мне не нравится формирование vtable'ов по дизасму с годболта. И ещё смущает, что для сборки не используется msvc-target. Как бы не было UB. |
Этот крейт не даст возможности строить VTable'ы, их всё так же придется переность "руками". Я попробовал, крейт так же не умеет работать с
Не совсем понимаю проблему. Если вы собираете компоненту для работы под Windows, вам придется ее собрать, указав через EditЯ в общем-то не против использования удобных макросов, просто самому пока что не охота заниматься этой частью. Но если будут пулл реквесты, я конечно же их приму |
Про переносить "руками" - да, понимаю. Предложил ради остальных описанных трансформаций. Предполагал, что будут ещё полезности. Если нет - окей. |
|
Еще одна проблема с этим крейтом в том, что он использует // из библиотеки 1С, types.h
#ifdef _WINDOWS
#define ADDIN_API __stdcall
#else
#define ADDIN_API
#endif //_WINDOWS// из библиотеки 1С, IMemoryManager.h
class IMemoryManager
{
public:
virtual ~IMemoryManager() {}
virtual bool ADDIN_API AllocMemory (void** pMemory, unsigned long ulCountByte) = 0;
virtual void ADDIN_API FreeMemory (void** pMemory) = 0;
};для референса: https://doc.rust-lang.org/reference/items/external-blocks.html |
Да, тогда и правда не подойдёт |


Хочу задать пару вопросов так как сам когда-то хотел реализовать подобный шаблон:
a. Почему target_family = unix?
b. Структура vtable’ов – implementation defined для компиляторов C++. Почему именно такая структура?
The text was updated successfully, but these errors were encountered: