Was ist der Unterschied zwischen der Umwandlung (OBJ1*) (void*) p und (obj1*) p, wobei p ein Zeiger auf OBJ2 -Typ istC++

Programme in C++. Entwicklerforum
Anonymous
 Was ist der Unterschied zwischen der Umwandlung (OBJ1*) (void*) p und (obj1*) p, wobei p ein Zeiger auf OBJ2 -Typ ist

Post by Anonymous »

Hintergrund:
Ich habe dies in GCC C ++ Standard -Bibliothekserweiterungpool_Allocator.H aufgetreten, das einen Allocator -Typ enthält, der Speicherpool verwendet, um die Effizienz der kleinen Kettenspeicherzuweisung zu verbessern. In der Mitgliedsfunktion _m_refill () von __pool_alloc_base muss sich die Konvertierung von char* (die für die Verwaltung von RAW -Speicher verwendet wird) zu _obj* (welche verwendet ist die Listenknotenstruktur, die zum Verwalten des freien Stücks verwendet wird. müssen es in OBJ1 -Typ umwandeln, wobei OBJ1 und OBJ2 völlig keine Erbschaftsbeziehung haben. Es gibt zwei Möglichkeiten, dies zu erreichen: < /p>

[*]

Code: Select all

(obj1*)p

Code: Select all

(obj1*)(void*)p< /code> < /li>
< /ul>
Meine Frage ist:
Was sind die Unterschiede zwischen diesen beiden? Warum sollte GCC den zweiten Weg wählen? (Ich denke, der erste wird einfach gut funktionieren wie der zweite) < /p>
Was ich ausprobiert habe:
Ich habe Deepseekr1 danach gefragt, und er denkt, es gibt keinen Unterschied (es gibt keinen Unterschied ( Ganz wie neu interpret_cast  (p) 
). Komplement:
Hier ist die Mitgliedsfunktion _m_refill , die einen Parameter erhalten, der die Blockgröße der freien Liste ist, die nachgefüllt werden muss. Diese Funktion wird aufgerufen, wenn die freie Liste eines bestimmten Größenblocks leer ist. Es wird zuerst _m_allocation_chunk verwendet, um einen großen Teil des Rohspeichers zuzuweisen (wie der Rückgabetyp char* ist) und dann die kostenlose List -Struktur mit dem __OBJ auf dem Rohspeicher erstellt. < /p>

Code: Select all

void* __pool_alloc_base::_M_refill(size_t __n) {
int __nobjs = 20;
char* __chunk = _M_allocate_chunk(__n, __nobjs);
_Obj* volatile* __free_list;
_Obj* __result;
_Obj* __current_obj;
_Obj* __next_obj;

if (__nobjs == 1)
return __chunk;
__free_list = _M_get_free_list(__n);

// Build free list in chunk.
__result = (_Obj*)(void*)__chunk;
*__free_list = __next_obj = (_Obj*)(void*)(__chunk + __n);
for (int __i = 1; ; __i++) {
__current_obj = __next_obj;
__next_obj = (_Obj*)(void*)((char*)__next_obj + __n);
if (__nobjs - 1 == __i) {
__current_obj->_M_free_list_link = 0;
break;
}
else
__current_obj->_M_free_list_link = __next_obj;
}
return __result;
}
Definition von __obj

Code: Select all

union _Obj {
union _Obj* _M_free_list_link;
char        _M_client_data[1];
};
Englisch ist nicht meine Muttersprache, daher kann die Beschreibung irgendwo unklar sein. Bitte zeigen Sie, wo immer unklar ist, und ich werde mein Bestes geben, um sie zu klären.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post