Enkel datastruktur

Den aktuelle version af siden er endnu ikke blevet gennemgået af erfarne bidragydere og kan afvige væsentligt fra den version , der blev gennemgået den 20. november 2013; checks kræver 58 redigeringer .

En simpel datastruktur ( eng.  plain old data , POD ) er en datatype i moderne programmeringssprog på højt niveau, der har et stift defineret arrangement af felter i hukommelsen, der ikke kræver adgangsbegrænsninger og automatisk kontrol . Variabler af denne type kan kopieres med simple hukommelseskopieringsrutiner som . Det modsatte er en administreret datastruktur . memcpy

Den nemmeste måde at definere en simpel datastruktur på er ved selvmodsigelse. Hvis compileren hemmeligt omarrangerer felterne fra brugeren, eller når den opretter en datastruktur, kalder i hemmelighed konstruktøren eller kalder destruktoren når strukturen er ødelagt , eller når der kopieres - en speciel kopiprocedure, så er dette en administreret (dvs. , ikke simpel) struktur.

Fordele ved simple datastrukturer

Simple datastrukturer har to funktioner.

Forudsigelig enhed i hukommelsen

Compileren kan automatisk genopbygge datastrukturen efter eget skøn (for eksempel ændre rækkefølgen af ​​felterne. I C++ sproget er dette kun muligt, hvis der er en offentlig/privat/beskyttet adgangsmærke mellem felterne. En sekvens af felter ikke adskilt af en sådan etiket skal anbringes i hukommelsen i feltangivelsesrækkefølge). En sådan omstrukturering kan alvorligt spare hukommelse, men bryder kompatibiliteten. I POD'er er denne optimering deaktiveret.

Med andre ord: typer mærket POD er ​​arrangeret i hukommelsen nøjagtigt som programmøren beskrev (måske med en vis justering ). Derfor kan kun POD'er bruges til at kommunikere mellem to runtime-biblioteker . Især at overføre data fra program til program, fra plugin til plugin, for at kommunikere med kode skrevet på et andet programmeringssprog . For hurtigt at skrive en kompleks filoverskrift som BMP til disk , kan du danne den i hukommelsen og derefter skrive den med én kommando - men den datastruktur, som vi danner overskriften i, skal også være en POD.

Ingen kontrolkode

Det betyder, at når et objekt dukker op, behøver du ikke at kalde konstruktøren, når du kopierer, tildelingsoperationen, og når du ødelægger, destruktoren. Dette giver til gengæld følgende fordele:

  1. Statisk initialisering. I stedet for at kalde konstruktøren skjult for programmøren, når programmet startes , kan POD'er samles, mens programmet kompileres.
  2. Triviel kopiering (herunder kopieringsarrays) med funktioner som memcpy.
  3. Igen er dette vigtigt for kommunikation mellem programmer: Hukommelsesadministratoren bør trods alt ikke administrere hukommelse, der ikke tilhører ham.
  4. Kun simple typer kan være i union(henholdsvis i Pascal record/case).
  5. Funktioner med bivirkninger (som systemfunktioner, der påvirker resultatet af et efterfølgende opkald GetLastError[1] ) er dårligt kompatible med automatisk administrerede typer.

Sprog, hvor alle typer er enkle

I C++

I C++ er POD defineret ved modsigelse. En datatype er en POD, hvis:

Ifølge C++-standarden er en simpel datatype struktureret nøjagtigt som beskrevet (og er fuldt kompatibel byte-for-byte i hukommelseslayout med en C-struktur). Compileren kan omorganisere den administrerede struktur på den måde, den anser for den mest effektive.

Pre-C++11 POD definition:

Et aggregat er enten et array eller en klasse, der ikke har:

Et aggregat kan initialiseres (som i C) med en liste af formen = {1, 2, 3};

Skalaren hedder:

(det vil sige en type, der ikke er en klasse, et array eller en reference)

En POD er ​​enten en skalar eller et array af andre POD'er eller en klasse, der er et samlet, og derudover:

I C++11

"Forudsigelig enhed i hukommelsen" og "ingen kontrolkode" er lignende, men forskellige type egenskaber. For eksempel kan datastrukturen STRRET[ 2] , som i Windows bruges til at overføre strenge fra en hukommelsesadministrator til en anden, " indpakkes " i kontrolkoden, men den anden egenskab, den forudsigelige enhed, forbliver. Derfor er begrebet POD'er i C++11 opdelt i tre.

En klasse kaldes "at have en triviel kopikonstruktør", hvis alle følgende er sande:

Den autogenererede trivielle kopi-konstruktør er memmove().

Udtrykkene "at have en triviel standardkonstruktør/tildelingsoperator/flytningskonstruktør/flytningsoperator" er defineret på nøjagtig samme måde.

En klasse kaldes "at have en triviel destruktor", hvis alt af følgende er sandt:

En sådan klasse kræver ikke destruktion, og hukommelsen, der indeholder den, kan deallokeres uden at blive ryddet op.

En klasse siges at være "trivielt kopierbar", hvis alle ovenstående specielle medlemsfunktioner er trivielle (undtagen standardkonstruktøren, som kan være ikke-triviel). Skalarer, såvel som arrays af trivielt kopierbare objekter, er også trivielt kopierbare. Sådanne typer kan kopieres via memcpy.

En klasse kaldes "trivial", hvis den er trivielt kopierbar og også har en triviel standardkonstruktør.

Med andre ord er en klasse triviel , hvis den har triviel:

En klasse er en standard enhedstype, hvis:

Lad os præcisere den sidste betingelse: i sproget kan der ikke være to forskellige objekter af samme type med samme adresse, hvilket betyder, at størrelsen af ​​en tom (uden ikke-statiske felter) klasse ikke kan være 0 (mindst 1). Der er dog lavet en undtagelse for "del B i klasse D : B", og dens størrelse (hvis tom) kan være strengt nul, hvilket resulterer i ingen "udfyldning" mellem begyndelsen af ​​D og dets første felt. Men på samme tid, hvis typen af ​​det første felt også er B, kan undtagelsen ikke anvendes, fordi (B *) & d og & (d. felt1) peger på forskellige objekter af samme type, og derfor " polstring" er nødvendig. Den sidste betingelse fra listen ovenfor betyder intet andet end "i klasserne af en standardanordning er en sådan pakning forbudt."

Sådanne typer har en forudsigelig enhed i hukommelsen (f.eks. er adressen på et objekt som helhed den samme som adressen på dets første felt, naturligvis, efter reinterpret_cast til samme type, for eksempel to void *), kan de naturligvis videregives til et andet runtime-bibliotek og til andre sprogprogrammering.

Så er POD  en række andre POD'er, eller en skalar eller en triviel klasse med en standardenhed, hvoraf alle ikke-statiske felter også er POD'er.

Til arbejde med kompileringstidskonstanter og statisk initialisering har C++11 et blødere koncept - en bogstavelig type . Nemlig:

POD'er og initialisering af "standard" og "værdi"

Siden C++03 er der en forskel mellem T t; og T t();, samt mellem nyt T og nyt T().

Versionen med tomme parenteser kaldes "værdiinitialisering", og uden dem kaldes "standardinitialisering".

Standardinitialisering: hvis standardkonstruktøren er triviel, bliver der ikke gjort noget, affald forbliver i objektet. Hvis standardkonstruktøren ikke er triviel, udføres den.

Initialisering efter værdi: hvis der er en eksplicit skrevet standardkonstruktør, så udføres den. Hvis ikke (dvs. hvis standardkonstruktøren er triviel eller genereres automatisk), så annulleres objektet først, og først derefter udføres konstruktøren (hvis den er ikke-triviel). Skalartyper sættes til nul, når de initialiseres med en værdi.

Embarcadero Delphi

Alle typer betragtes som simple datastrukturer undtagen:

Noter

  1. GetLastError Arkiveret 6. december 2013 på Wayback MachineMSDN
  2. STRRET-struktur (Windows) . Hentet 6. april 2013. Arkiveret fra originalen 18. april 2013.

Se også