2011-06-29 5 views
3

Quel est le moyen le plus sûr pour NSString de contenir faiblement un char const * appartenant à une chaîne std :: string? Les deux exemples ci-dessous fonctionnent sur un test simple, dans des logs, et comme présenté dans un NSTableView, mais je suis préoccupé par un comportement étrange jusqu'à la route. Il peut s'agir du caractère null supplémentaire de c_str() qui est simplement ignoré (à cause du paramètre length) et qui fonctionnera correctement.NSString contenant faiblement const char * de std :: string

Étant donné:

std::string const * stdstring = new std::string("Let's see if this works"); 

Puis:

NSString * aStr = [[NSString alloc] initWithBytesNoCopy: 
    stdstring->data() length: stdstring->length() 
    encoding:NSUTF8StringEncoding freeWhenDone:NO]; 

ou:

NSString * aStr2 = [[NSString alloc] initWithBytesNoCopy: 
    stdstring->c_str() length: stdstring->length() 
    encoding:NSUTF8StringEncoding freeWhenDone:NO]; 

ou autre chose?

+1

Pour d'autres qui lisent ceci, la copie de chaîne est ridiculement bon marché dans la grande majorité des cas; à moins que vous n'écistiez d'énormes chaînes (100kB +), ne le risquez pas. Si vous faites cela, confirmez votre besoin de les charger en une seule chaîne en premier; et le profil avant de regarder les «accélérations» comme ça. – rvalue

Répondre

2

La documentation pour initWithBytesNoCopy:length:... indique clairement que length sera le nombre d'octets utilisés, de sorte que le caractère de fin nul sera toujours ignoré. Par conséquent, le contenu de la mémoire retournée par data() et c_str() convient également.

Avec cela à l'esprit:

Les garanties à vie de la mémoire retournée par std::string « s data() et c_str() fonctions sont identiques - ils survivront jusqu'à ce que vous appelez une fonction membre non-const sur l'objet chaîne. Il dépend de l'implémentation si la structure de données interne est déjà un tableau de caractères à terminaison nulle, donc en général, data() sera moins cher ou d'une complexité identique à c_str(). Je voudrais donc aller pour data().

+1

Notez également qu'avec la prochaine norme c_str() et data() deviendront des synonymes selon la spécification standard – sehe

Questions connexes