2010-09-02 7 views
1
#include <cstdlib> 
#include <iostream> 

int main(int argc, char *argv[]) 
{ 
    cout << "size of String " << sizeof(string); 

    system("PAUSE"); 
    return EXIT_SUCCESS; 
} 

Sortie:C++ sizeof (...)

taille

de String = 4

Est-ce que cela veut dire que, depuis sizeof(char) = 1 Byte (0 to 255), chaîne ne peut contenir que des caractères 4?

+2

Où est "string" vient? Exécuter l'exemple de code via un compilateur produirait une erreur de compilation, car un certain nombre de choses seraient indéfinies. (Je ne peux pas imaginer la taille la plus naïve des implémentations 'chaîne' étant seulement 4.) –

+0

@ dash-tom-bang juste édité pour inclure mes fichiers d'en-tête –

+0

sizeof calcule la taille d'un type de données, ce qui est utile si vous faites une allocation dynamique. Je crois que string.length ou size est ce que tu veux. –

Répondre

19

Il est pas clair de votre exemple ce que « string » est. Si vous avez:

#include <string> 
using namespace std; 

alors string est std::string, et sizeof(std::string) vous donne la taille de l'instance de classe et ses membres de données, pas la longueur de la chaîne. Pour obtenir cela, utilisez:

string s; 
cout << s.size(); 
2

Non, cela signifie que le sizeof la chaîne de classe est 4.

Cela ne signifie pas qu'une chaîne peut être contenue dans 4 octets de mémoire. Pas du tout. Mais vous avez à la différence entre la mémoire dynamique, utilisée pour contenir les size caractères d'une chaîne peut être faite de, et la mémoire occupée par l'adresse de Essayez de voir comme le premier de ces personnages

ceci:

contents --------> |h|e|l|l|o| |w|o|r|ld|\0| 

sizeof 4 fait référence à la mémoire occupée par le contenu. Qu'est-ce qu'il contient? Juste un pointeur vers (l'adresse de) le premier caractère dans le tableau char.

Combien de caractères une chaîne en peut contenir? Idéalement, un caractère par octet disponible en mémoire.

Combien de caractères possède une chaîne? Eh bien, theres une fonction membre appelée size() qui vous dira juste que

size_type size() const 

Voir plus sur la page SGI!

+0

Qu'est-ce que "sizeof the class String is 4" signifie réellement? –

+0

C'est la taille des variables membres nécessaires pour la fonction de classes de chaînes. – GWW

+0

C'est la taille du 'pointer' de la chaîne' class'. Ce qui dans ce cas semble être sur un entier de 32 bits. –

2

Pas du tout. Cela signifie que la structure de la classe est celle-ci, elle n'inclut pas la mémoire dynamique qu'elle peut contrôler. std :: string va se développer dynamiquement pour répondre à toute taille requise.

s.max_size() // will give the true maximum size 
s.capacity() // will tell you how much it can hold before resizing again 
s.size() // tells you how much it currently holds 

Le 4 vous obtenez de sizeof est probablement un pointeur de quelque sorte à la structure plus grande. Bien que certaines optimisations sur certaines plates-formes l'utilisent en tant que données de chaîne réelles jusqu'à ce qu'elles deviennent plus grandes que ce qu'elles peuvent contenir.

0

Un objet string contient un pointeur vers un tampon sur le tas qui contient les données de chaîne réelles. (Il peut également contenir d'autres méta-informations spécifiques à l'implémentation, mais ce n'est pas le cas pour vous.) Vous obtenez donc la taille de ce pointeur, et non la taille du tableau vers lequel il pointe.

+0

Avec l'implémentation de GCC, std :: string se compose d'un seul pointeur dans une structure globale qui garde la taille, la capacité et le tampon ensemble dans le même bloc de mémoire continue. Probablement pas rare dans d'autres implémentations non plus. – UncleBens

+0

Microsoft utilise cette approche pour leur classe 'CString', mais étonnamment pas pour leur version de' std :: string'. – dan04

12

Lorsque string est défini comme:

char *string; 

sizeof(string) vous indique la taille du pointeur. 4 octets (Vous êtes sur une machine 32 bits.) Vous n'avez pas encore affecté de mémoire pour contenir du texte. Vous voulez une chaîne de 10 caractères? chaîne = malloc (10); Maintenant les points de chaîne à un tampon de 10 octets, vous pouvez mettre des caractères.

sizeof(*string) sera de 1. La taille de ce que la chaîne pointe vers, un caractère.

Si vous avez la place

char string[10]; 

sizeof(string) serait 10. Il est un tableau 10-char. sizeof(*string) serait 1 encore.

Il serait utile de rechercher et de comprendre la macro __countof.

Mise à jour: oh, oui, MAINTENANT inclure les en-têtes :) 'chaîne' est une classe dont les instances occupent 4 octets, c'est tout ce que cela signifie. Ces 4 octets pourraient pointer vers quelque chose de beaucoup plus utile, comme une zone de mémoire contenant plus de 4 caractères.

Vous pouvez faire des choses comme:

string s = "12345"; 
cout << "length of String " << s.length(); 
3

Je sais que beaucoup de gens ont répondu à votre question, mais voici quelques points:

  1. Ce n'est pas la taille de la string ou la capacité de la chaîne, cette valeur représente la taille structurelle de la classe string, que vous pouvez voir par son implémentation (et elle peut passer de l'implémentation à l'implémentation) qui est un simple pointeur; Comme le sizeof(string) est la taille de la structure de classe, vous obtiendrez la taille du seul pointeur interne, qui dans votre cas est de 4 octets (parce que vous êtes dans une machine 32 bits, cela peut changer de plate-forme à plate-forme aussi);
  2. Ce pointeur à l'intérieur de la classe string pointe vers un tampon mémoire dans lequel la classe contiendra les données de chaîne réelles. Ce tampon mémoire est réalloué si nécessaire, il peut augmenter/diminuer lorsque vous ajoutez/supprimez/créez du texte de chaîne supplémentaire;
  3. Si vous souhaitez obtenir la taille réelle de la chaîne, vous devez appeler la méthode size() de la classe qui vérifiera la taille de la chaîne de mémoire tampon (qui n'est pas la même que la taille de mémoire tampon).

Je pense que votre problème est votre conception de sizeof, voir plus d'informations here et here est une explication sur la façon dont cela fonctionne.

6

sizeof(char) est toujours 1 octet. A byte que nous pensons est 8-bits need not be the case. Il existe des architectures où un BYTE est 32 bits, 24 bits et ainsi de suite. Le sizeof appliqué à tout autre type est en multiples de sizeof(char) qui est by definition 1. La prochaine chose importante à noter est que C++ a trois types de caractères: plain char, signed char and unsigned char. Un plain char est signed ou unsigned. Il est donc faux de supposer que char ne peut avoir que des valeurs comprises entre 0 et 255. Cela n'est vrai que lorsqu'un char est à 8 bits, et plain char est unsigned.Cela étant dit, supposer que 'string' est 'std::namespace', sizeof(string) == 4 signifie que la taille de la classe 'std::string' est de 4 octets. Il occupe 4 fois le nombre d'octets qu'un 'char' prend sur cette machine. Note that signed T, unsigned T always have the same size. Cela ne signifie pas que le tampon des caractères (appelé chaîne dans le langage courant) n'est que de 4 octets. Dans la classe 'std::string', il existe un pointeur de membre non statique qui est alloué dynamiquement pour contenir le tampon d'entrée. Cela peut avoir autant d'éléments que le système le permet (C++ n'impose aucune restriction sur cette longueur). Mais puisque la classe 'std::string' ne détient que le pointeur sur ce tampon de longueur potentiellement infite, le sizeof (std :: string) reste toujours le même que le pointeur sizeof sur l'architecture donnée qui est sur votre système 4.

0

vous pouvez également utiliser chaînes et peut trouver sa longueur par la fonction string.length(). regardez le code ci-dessous:

// Finding length of a string in C++ 

#include<iostream> 
#include<string> 
using namespace std; 

int count(string); 

int main() 
{ 
string str; 
cout << "Enter a string: "; 
getline(cin,str); 
cout << "\nString: " << str << endl; 
cout << count(str) << endl; 

return 0; 

} 

int count(string s){ 
if(s == "") 
    return 0; 
if(s.length() == 1) 
    return 1; 
else 
    return (s.length()); 

} 

vous pouvez obtenir les détails de: http://www.programmingtunes.com/finding-length-of-a-string-in-c/

Questions connexes