когда будет выделено пространство памяти, если вектор определен глобально - PullRequest
3 голосов
/ 28 января 2012

Если я определю и инициализирую большой вектор глобально, будет ли его размер включен в объектный файл?

например,

case 1 : Если у меня есть неинициализированный большой глобальный массив x, его размер правильно отображается в размере сегмента bss, но он не будет добавлен к размеру объектного файла, так как это неинициализированные данные, это ожидается .

#include <iostream>
#define SIZE 200000000

char x[SIZE];

int main (void)
{
  return 0;
}

$ размер a.out

text           data            bss            dec            hex        filename
1762            572        200000040        200002374        bebcb46        a.out

$ ls -l a.out

-rwxrwxr-x. 1 ur ur 7477 Jan 28 02:52 a.out

case 2: аналогично, если у меня большой инициализированный глобальный массив, его размер будет включен в сегмент данных (не в bss), и он также будет отражать размер объектного файла, как и ожидалось.

#include <iostream>
#define SIZE 200000000

//remaining entries will be value initialized
char x[SIZE] = { 'a', 'b' };

int main (void)
{
  return 0;
}

$ размер a.out

text           data            bss            dec            hex        filename
1762        200000600             24        200002386        bebcb52        a.out

$ ls -l a.out

-rwxrwxr-x. 1 ur ur 200007533 Jan 28 02:34 a.out

case 3: Теперь, если вместо инициализированного глобального массива я использую инициализированный большой глобальный вектор, то я ожидаю поведение, подобное case 2 (размер файла obj включает размер инициализированного массива ) но вместо этого Я получаю следующее поведение

#include <iostream>
#include <vector>
#define SIZE 200000000

std::vector<char> x(SIZE, 'c');

int main (void)
{
  return 0;
}

$ размер a.out

text           data            bss            dec            hex        filename
4936            604             48           5588           15d4        a.out

$ ls -l a.out

 -rwxrwxr-x. 1 ur ur 13583 Jan 28 02:44 a.out

Может ли кто-нибудь объяснить это поведение, почему инициализированный вектор отсутствует в объектном файле и как глобально определенный вектор инициализируется во время выполнения. Я думаю, что мне не хватает чего-то фундаментального Спасибо

Ответы [ 2 ]

10 голосов
/ 28 января 2012

std::vector выделяет свое хранилище в куче во время выполнения. Если вы определите такую ​​переменную как глобальную переменную, ее конструктор будет запущен до запуска main(). С аргументами, которые вы дали, конструктор выделит пространство для SIZE символов в куче, а затем запустит цикл для сохранения буквы c в каждом из них.

Все, что присутствует в вашем объектном файле, это единственная копия буквы c, которая передается в конструктор вектора.

3 голосов
/ 28 января 2012

Тип вектора обычно содержит всего несколько указателей (три - общее число: начало / конец / емкость) и динамически распределяет память по мере необходимости. В основном, только sizeof(std::vector<type>) будет в контексте переменной, а capacity()*sizeof(type) будет динамически выделяться из кучи.

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