Ik heb een applicatie die een eigen string klasse heeft. Nu komt de volgende declaratie vaak voor:
Door die declaratie, zitten veel strings dubbel in het geheugen: een keer in de .DATA section (of .TEXT) en een keer op de heap. Dat is natuurlijk zonde van het geheugen, en dat wil ik graag oplossen. Mijn plan is een copy-on-write in te bouwen, maar helaas kan dat niet voor alle strings:
In het bovengenoemde geval moeten alle buffers behalve TextBuffer worden gekopieerd.
Om dat in te bouwen, wilde ik een functie bouwen die vaststelt of het geheugen van de string gewijzigd kan worden. Als het niet gewijzigd kan worden, dan hoef ik het dus ook niet te kopiëren.
Ik vermoed dat ik deze voor al mijn target platforms (win32,win64,xbox360 en ps3) opnieuw zal moeten implementeren. Xbox en PS3 mogen we hier niet bespreken (NDA stuff), maar win32 en win64 mogen gelukkig wel.
Is de bovengenoemde functie haalbaar om te implementeren? Is VirtualQuery bruikbaar, en is het sneller dan een malloc plus een memcpy?
C++:
1
| FString Dinges = FString(L"Hello world"); |
Door die declaratie, zitten veel strings dubbel in het geheugen: een keer in de .DATA section (of .TEXT) en een keer op de heap. Dat is natuurlijk zonde van het geheugen, en dat wil ik graag oplossen. Mijn plan is een copy-on-write in te bouwen, maar helaas kan dat niet voor alle strings:
C++:
1
2
3
4
5
6
7
8
| char_t BSSBuffer[1024]; char_t DataBuffer[2] = { L'4', 0 }; // let op: niet const const char_t TextBuffer[2] = { L'4', 0 }; void Foo() { char_t StackBuffer[1024]; // doe dingen } |
In het bovengenoemde geval moeten alle buffers behalve TextBuffer worden gekopieerd.
Om dat in te bouwen, wilde ik een functie bouwen die vaststelt of het geheugen van de string gewijzigd kan worden. Als het niet gewijzigd kan worden, dan hoef ik het dus ook niet te kopiëren.
code:
1
| bool IsReadOnlyMemory(void* ptr ); |
Ik vermoed dat ik deze voor al mijn target platforms (win32,win64,xbox360 en ps3) opnieuw zal moeten implementeren. Xbox en PS3 mogen we hier niet bespreken (NDA stuff), maar win32 en win64 mogen gelukkig wel.
Is de bovengenoemde functie haalbaar om te implementeren? Is VirtualQuery bruikbaar, en is het sneller dan een malloc plus een memcpy?
Localhost, sweet localhost