Дескрипторы libuv имеют поле void* data
для переноса любой контекстной информации (довольно стандартный шаблон для обратных вызовов в C-land). Однако, поскольку я работаю в C++-стране, я хотел бы использовать наследование для непосредственного хранения контекста в дескрипторе. Основное преимущество заключается в хранении нескольких элементов контекста, для которых IIUC требует выделения кучи для объединения их в один указатель, скажем, std::tuple<...>*
или какую-то временную структуру (поправьте меня, если я ошибаюсь, и я могу избежать выделения кучи даже в C-land) .
Мои основные опасения:
- Указатели на дескрипторы в конечном итоге используются в C-land (библиотека libuv). Не уверен, что здесь есть какие-либо угловые случаи, связанные с взаимодействием.
- libuv имеет собственную систему псевдонаследования путем повторения полей от родителей в дочерних элементах. Это похоже на то, как компилятор может размещать поля из базовых классов в производных классах. Не уверен, как это будет взаимодействовать с наследованием С++.
- Из того, что я исследовал, стандарт на самом деле не определяет какой-либо макет памяти для наследования, это зависит от компилятора. Не уверен, что это влияет на вещи.
Итак, могу ли я безопасно наследовать от дескрипторов libuv в C++? Бонусные баллы, если вы также можете прояснить вышеуказанные моменты.
new
. Если libuv сделает это (гипотетически), я думаю, наследование не сработает, так как нет доступной памяти для каких-либо полей производного класса. - person Roshan   schedule 23.07.2020