Stack allokering kan ju bli i princip hur farlig som helst.
Hur menar du då?
Pilla på data som ligger på stacken genom en pekare är nog inte världens mest goda idé.
Tvärtom, en ganska vanlig situation.
Vanligt är att ha en lokal buffert, fylla den med data från någon funktion. Sedan traversera och behandla datat med en pekare in i bufferten.<font size="1" face="Verdana, Arial, Helvetica, sans-serif">Kod:<font size="1" face="Verdana, Arial, Helvetica, sans-serif" color="#666600">byte Message[some_size];
GetSomeData(Message, sizeof(Message));
byte *cursor = &Message[0];
// Sen accessar man datat med cursor-pekaren
Om man är ny (har varit där en gång själv)...
Om du är en erfaren och duktig C++ programmerare vet du väl vad som är vanliga problem med heapallokerat minne? ;-)
Antalet CPU:er har väl inget som helst att göra med heap:en.
Jovisst, det påverkar prestanda negativt om man inte vet vad en heapallokering egentligen gör...
Man har en och samma addressrymd - oavsett antalet processorer. Så om 4 trådar, körandes på varsin processor, samtidigt free'ar (allokeringen är oftast mycket billigare) minne, måste detta serialiseras (1 processor får jobba, de andra vilar!) - om man inte tänker till. Vilket gör att 3 trådar (processorer) sover medan den 4:e låser minneshanteraren. Hur bra är det att ha 75% CPU-tid outnyttjad? Vidare kan det ge onödiga fragmenteringsproblem. Håller man så mycket arbetsdata som möjligt på stacken, får man mindre av dessa problem. Givetvis är detta inte alltid möjligt - men det är sällan man ser folk optimera med avseende på detta, och det ger dåligt prestanda. Jag har sett flera exempel på detta hos flera företag jag hjälpt med prestandaproblem i system som går live.
Gör man frekventa allokeringar, finns det flera saker man kan göra för att undvika heapmanagern som flaskhals:
- Håll data på stacken, istället för att belasta heapen.
- Ha pooler med allokerat data internt i programmet istället för att allokera och free:a data ofta.
- Minimera antalet heapallokeringar - har du 2 heapallokerade datastrukturer som kan slås ihop är detta oftast effektivare.
- Använd som sista åtgärd en effektiv heapmanager, MP Heap från Platform SDK eller SmartHeap från www.microquill.com
Läs gärna mer på http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dngenlib/html/heap3.asp om vanliga problem och lösningar till heapproblem.
Som du säger är det uppenbarligen förkastligt att returnera en pekare till en lokal variabel. Skilj dock detta från att jobba med en pekare till en lokal buffert inom en funktion - något som varken är ovanligt eller riskabelt.
Vidhåller du fortfarande att ditt exempel är effektivare med heapallokering? Isåfall, förklara vad du menar, så visar jag gärna hur jag tänker mig att det fungerar.
Om LilleSkutt vill ha sitt problem löst måste han nog beskriva mer detaljerat vad som gått fel. Där tror jag vi är överens :)
[Redigerat av developer den 07 okt 2001]