Heim  >  Artikel  >  Backend-Entwicklung  >  Garantiert die Platzierung auf Arrays die Portabilität in C?

Garantiert die Platzierung auf Arrays die Portabilität in C?

Patricia Arquette
Patricia ArquetteOriginal
2024-11-12 16:48:02407Durchsuche

Does Placement New on Arrays Guarantee Portability in C  ?

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:

  • Manuelle Platzierung neu: Anstatt die Platzierung neu im Array zu verwenden, verwenden Sie sie, um jedes Array-Element einzeln zu initialisieren. Zum Beispiel:
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);
}
  • Manuelle Zerstörung:Zerstören Sie jedes Array-Element manuell, bevor Sie den Puffer löschen, um Speicherlecks zu verhindern.

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn