Bonjour a tous, j ai creer ma propre classe MYString, qui fait plein de choses, c est en fait un one-to-one mapping de la classe String de Java, afin de faciliter le portage d application depuis Java.
Cette classe contient un wchar_t* m_Ptr, qui est le buffer unicode.
J ai des soucis de performances dans mon application a causes des litteraux.
Pour le moment je copie le buffer dans m_Ptr.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 MYClass* toto = new MYClass(L"toto");
Tout mon code prend en parametre des MYString car elle peuvent etre formatees a tout moment, ou stockees, ...
Mon code comprend beacuoup beaucoup de litteraux, et j aimerais savoir s il est possible d eviter ce memcopy sans ajouter un parametre au constructeur, style :
et creer la string de cette maniere
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 MYClass(wchar_t* aStr, bool bIsLitteral = false);
true voulant dire qu il sagit d un litteral, donc faire directement m_Ptr = aStr, et ne pas deleter m_Ptr dans le destructeur.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 MYClass* toto = new MYClass(L"toto", true);
Inutile de chercher a deleter un litteral, ca crashe, c est stocker a un endroit read/only de la memoire(segment je crois)
Meme avec cette solution qui evite le memcopy, j ai un autre souci.
Je fais souvent dans mon code
Context::getLocal(MYString* aString) peut etre appeler soit avec un litteral soit avec une string formatee.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 Context* myContext, .... MYValue* value = myContext->getLocal(&MYClass(L"toto", true))
Quand il s agit un litteral uniquement, je fait toujours MYValue* value = myContext->getLocal(&MYClass(L"toto", true)) et sinon en general appelle :
myContext->getLocal(myString) , myString vient d ailleur et peut etre n importe quoi, soit un litteral, soit une chaine formatee.
L ideal serait d avoir toto en static ou variable globale. Comme j ai des centaines de litteraux, je voulais savoir si c est propre creer un tableaux de MYString avec 200 valeur par exemple, et de les stocker selon un index, style :
Pour finalement faire
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 enum { ID_TOTO = 0, ID_TITI, ID_TUTU ,.... } MYString** g_stringLitteralPool = new MYString[200] g_stringLitteralPool[ID_TOTO] = new MString(L"toto", true); g_stringLitteralPool[ID_TUTU] = new MString(L"tutu", true);, ...
Y a aussi possibiliter de calculer l index de la string dans le tableau a partir du hash du litteral, pour la stocker d une part et pour la recuperer d autre part.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 Context* myContext, .... MYValue* value = myContext->getLocal(g_stringLitteralPool[ID_TOTO])
Je sais pas si c est assez propre de faire ca, mais surtout savoir si dans le concept c est ok.
Je serait tres reconnaissant si quelqu un a deja eu a faire face a ce genre de probleme de m indiquer quelle a ete sa solution, sinon si vous avez quelconque feedback, c est toujours tres interessant.
Merci bien
Partager