Почему так много разрыва в адресах двух векторных элементов? - PullRequest
0 голосов
/ 14 октября 2018

Я изучаю векторы в C ++.При печати адреса двух смежных vector<string> элементов я получаю результат, который меня немного смущает.
Программа

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

int main()
 {  
   vector<string> word;

   //Enter any two words
     string ch;
     for(int i=1;i<3;i++)
      {
       getline(cin,ch);
       word.push_back(ch);
       }

   //Display the words
     for(auto i:word)
      {
       cout<<i<<" ";
      }  
     cout<<endl;

    //Display address of first two elements

      cout<<word.data()<<" "<<(word.data()+1)<<endl;

     return 0;
  }

INPUT Data: привет
мир
ВЫХОД: hello world
0x1b9f060 0x1b9f080

Я не получаю только то, что всего 10 символов(5 на первом входе и еще пять на втором), и каждый символ занимает 1 байт.
Так почему же между обоими элементами вектора есть разрыв в 20 байт?
Я проверил с помощью vector но разрыв был только four байтов.

Ответы [ 2 ]

0 голосов
/ 14 октября 2018

Прежде всего, фактический «пробел» составляет 32 байта, поскольку адреса имеют шестнадцатеричные значения 0x1b9f080 - 0x1b9f060 = 0x20 = 32.

Это размер элемента vector, который в данном случае равен std::string.Наиболее важно, std::string - это класс, и его размер приблизительно определяется размерами его членов, как и любой другой класс.

Каковы действительные члены std::string и какой размер он имеет в результатезависит от реализации стандартной библиотеки, которую вы используете в настоящее время.Однако самое важное то, что размер std::string совсем не зависит от длины фактической строки, которую он хранит, поскольку он содержит только указатель на нее и сама строка находитсяв другом месте (в куче).

0 голосов
/ 14 октября 2018

A string - это не массив символов, это указатель на выделенное пространство (заданного размера), которое содержит то, что вы считаете строкой.Обычно имеется также дополнительная информация, такая как фактический размер строки (поскольку строки C ++ могут содержать символ \0), выделенное пространство, возможно ...

Существуют исключения, такие как Small Array Optimizations,но допустим, что это не ваша настоящая строка для ясности.

* * * * int в вашем vector<int> имеет размер 4, это то, что мы действительно ожидаем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...