Kann Placement New für Arrays die Portabilität sicherstellen?
Während Placement New eine Möglichkeit bietet, Arrays in C zu initialisieren, bringt seine Verwendung für Arrays Potenzial mit sich Portabilitätsprobleme. Insbesondere kann der von new[] erhaltene Zeiger von der bereitgestellten Adresse abweichen, was die Pufferzuweisung für das Array behindert.
Der Standard 5.3.4, Anmerkung 12, erkennt diese Diskrepanz an, was die Zuweisung eines Puffers zu einer Herausforderung macht die passende Größe für das Array. Ein Beispiel verdeutlicht das Problem:
int main() { const int NUMELEMENTS = 20; char *pBuffer = new char[NUMELEMENTS * sizeof(A)]; A *pA = new(pBuffer) A[NUMELEMENTS]; // With Visual Studio, pA will be four bytes higher than pBuffer printf("Buffer address: %x, Array address: %x\n", pBuffer, pA); }
In diesem Beispiel scheint der Compiler eine Anzahl von Array-Elementen in den ersten vier Bytes des Puffers zu speichern. Infolgedessen kommt es zu einer Speicherbeschädigung, da dem Puffer nur sizeof(A) * NUMELEMENTS Bytes Speicherplatz zugewiesen ist.
Portabilitätsprobleme vermeiden:
Um diese Portabilität zu mildern Bei Problemen sollten Sie den folgenden Ansatz in Betracht ziehen:
int main() { const int NUMELEMENTS = 20; char *pBuffer = new char[NUMELEMENTS * sizeof(A)]; A *pA = (A*)pBuffer; for (int i = 0; i < NUMELEMENTS; ++i) { pA[i] = new (pA + i) A(); } printf("Buffer address: %x, Array address: %x\n", pBuffer, pA); }
Es ist wichtig zu beachten, dass der zusätzliche Aufwand für die Platzierung von new[] je nach Implementierung und Klassendefinition variieren kann. Dennoch gewährleistet dieser manuelle Ansatz die Portabilität über verschiedene Compiler hinweg und macht eine dynamische Ermittlung des Overheads überflüssig.
Das obige ist der detaillierte Inhalt vonGarantiert die Platzierung auf Arrays die Portabilität in C?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!