2014-09-08 4 views
3

У меня есть следующее заявлениеВ C++ Как сравнить размер массива символов с строкой?

char c[] = "Hello"; 
string c2 = "Hello"; 

Я хочу, чтобы сравнить), сколько байтов памяти как необходимость и б) длины символов. Я знаю, что массивы символов добавляют нулевой ограничитель в конце строки, где в качестве типов данных строк нет.

Использование

cout << "The sizeof of c: " << sizeof(c); 
cout << "The sizeof of c2: " << sizeof(c2); 

возвращает 6 и 4, и я не уверен, почему 4, а не 5? также, как это функция длины сравнить здесь ...

Когда я использую следующий код

cout << "The sizeof of c: " << sizeof(c); 
cout <<"The sizeof of c2: " << c2.length(); 

я получаю 6 и 5 ... но это сравнение длин таким же образом? Спасибо.

+0

'sizeof (c2) == 4' ?? В самом деле? Каков реальный тип 'c2'? Это явно не 'std :: string' –

+1

@ DavidRodríguez-dribeas: Почему бы и нет? Есть ли что-то незаконное в реализации строк, которое содержит одиночный указатель на блок метаданных ala pimpl? –

+0

@BenVoigt: Я предполагаю, что технически это было бы возможно, не видел никакой реализации 'std :: string', делающей это когда-либо. –

ответ

8

а) сколько укусы памяти как нужно и

Вы правильно использовали оператор SIZEOF, что для определения того, сколько байт массив символов занимает.

Это

sizeof(c) 

Что касается объекта типа std::string то она занимает два экстента памяти. Первый используется для выделения самого объекта, а второй используется для выделения строки, удерживаемой объектом.

Так

sizeof(c2) 

даст вам размер памяти, занимаемой объектом.

c2.capacity() 

предоставит вам размер, выделенный объекту для хранения строки и, возможно, некоторые дополнительные символы, которые будут заполнены в будущем.

Когда я использую следующий код соиЬ < < "The SizeOf из C:" < < SizeOf (с); cout < < «Размерof c2:» < < c2.length();

я получаю 6 и 5

Если вы хотите сравнить строки сам без завершающего нуля, что массив символов имеет, то вы должны написать

cout << "The length of c: " << std::strlen(c); 
cout <<"The length of c2: " << c2.length(); 

и вы получите результат 5 и 5.

Вы можете сделать следующий эксперимент с объектами типа std :: string.

std::string s; 

std::cout << sizeof(s) << '\t' << s.capacity() << '\t' << s.length() << std::endl; 

std::string s1(1, 'A'); 

std::cout << sizeof(s1) << '\t' << s1.capacity() << '\t' << s1.length() << std::endl; 

std::string s3(2, 'A'); 

std::cout << sizeof(s2) << '\t' << s2.capacity() << '\t' << s2.length() << std::endl; 

std::string s3(16, 'A'); 

std::cout << sizeof(s3) << '\t' << s3.capacity() << '\t' << s3.length() << std::endl; 
0

Ну размер c[] = "Hello" равен 6, потому что массиву символов необходимо выделить еще 1 байт из памяти для нулевого \0 символов.

Функция length() возвращает количество символов в строковом литерале. Оно не включает в себя нулевой символ \0 при подсчете.

+0

* «Я хочу для сравнения a) **, сколько байтов памяти ** необходимо, и b) длины символов "* –

+0

Ну, оба они нуждаются в 6 байтах памяти. Его просто функция' length() 'не возвращает размер в байтов, а скорее нет. присутствующих символов –

+0

Конечно, особенно класс струн, правильно? –

0

std::string, как std::unique_ptr, std::shared_ptr и std::vector, умный указатель плюс некоторые дополнительные функции-члены манипуляция.

Когда вы передаете один номер sizeof, вы измеряете размер смарт-указателя - sizeof (std::string), а не контент.

3

sizeof(c)sizeof(c) - это размер массива, который содержит пять символов в литеральном выражении, с которым вы его инициализируете, плюс нулевое значение терминатора в конце, дающее в общей сложности шесть байтов.

sizeof(c2) - это класс string, который не говорит вам ничего особенно полезного. Класс управляет динамически распределенной памятью, содержащей символы строки; это не относится к самому объекту string.

c2.length() - количество символов в строке, управляемой c2; пять символов.

1

Я предполагаю, что размер [] включает завершающий нулевой символ, таким образом, 5 + 1 = 6 байтов.

Размер строкового объекта возвращает 4 байта, который, вероятно, является размером указателя, который указывает на строковый объект. 32 бит.

В последнем случае вы используете длину, запрограммированную для подсчета количества символов.

2

а) сколько байт памяти как нужно, и б) характер длины

  • переменная «с» использует 6 байт на стеке (5 букв и нулевой терминатор)

  • SizeOf (с) = 6, STRLEN (с) = 5

  • Всего байт памяти необходимо: 6


  • если 'с' было 1000 символов,

    • SizeOf (с) = 1001, STRLEN (с) = 1000)
  • Всего байт памяти необходимо: 1001


  • переменная «c2» использует 4 байта в стеке (я подозреваю, что указатель, но не подтвердили), и, по меньшей мере, 5 байт где-нибудь еще (я думаю, что куча).

  • SizeOf (с2) = 4, c2.size() = 5, STRLEN (c2.c_str()) = 5

  • Всего байт памяти необходимо: 9+ (4 + 5) +


  • если 'c2' было 1000 символов, т.е. c2.size() == 1000

  • 4 байта в стеке, и

  • по крайней мере, 1000 байт где-нибудь еще (в зависимости от реализации, вероятно, еще несколько)

  • Всего байт памяти, необходимых: 1004+

Примечание: станд :: строка представляет собой контейнер , Я думаю, что такие значения не указаны, и должны рассматриваться как зависимые от реализации.

Смежные вопросы