Boxing ist die Umwandlung eines Wertes in einen Referenztyp, wobei die Daten an einem bestimmten Offset in einem Objekt auf dem Heap liegen.
Was die eigentliche Aufgabe des Boxens betrifft. Hier sind einige Beispiele
Mono C++
void* mono_object_unbox (MonoObject *obj)
{
MONO_EXTERNAL_ONLY_GC_UNSAFE (void*, mono_object_unbox_internal (obj));
}
#define MONO_EXTERNAL_ONLY_GC_UNSAFE(t, expr) \
t result; \
MONO_ENTER_GC_UNSAFE; \
result = expr; \
MONO_EXIT_GC_UNSAFE; \
return result;
static inline gpointer
mono_object_unbox_internal (MonoObject *obj)
{
/* add assert for valuetypes? */
g_assert (m_class_is_valuetype (mono_object_class (obj)));
return mono_object_get_data (obj);
}
static inline gpointer
mono_object_get_data (MonoObject *o)
{
return (guint8*)o + MONO_ABI_SIZEOF (MonoObject);
}
#define MONO_ABI_SIZEOF(type) (MONO_STRUCT_SIZE (type))
#define MONO_STRUCT_SIZE(struct) MONO_SIZEOF_ ## struct
#define MONO_SIZEOF_MonoObject (2 * MONO_SIZEOF_gpointer)
typedef struct {
MonoVTable *vtable;
MonoThreadsSync *synchronisation;
} MonoObject;
Das Unboxing eines Objekts in Mono ist ein Prozess des Castings eines Zeigers mit einem Offset von 2 gpointers im Objekt (z.B. 16 Bytes). A gpointer
es un void*
. Dies macht Sinn, wenn man sich die Definition von MonoObject
da es sich eindeutig nur um eine Kopfzeile für die Daten handelt.
C++
Um einen Wert in C++ zu boxen, könnten Sie etwas wie folgt tun:
#include <iostream>
#define Object void*
template<class T> Object box(T j){
return new T(j);
}
template<class T> T unbox(Object j){
T temp = *(T*)j;
delete j;
return temp;
}
int main() {
int j=2;
Object o = box(j);
int k = unbox<int>(o);
std::cout << k;
}