2013-08-13 3 views
4

У меня есть сомнения по поводу использования std::vector. Если у меня есть структура с объектом std::vector с неопределенным пространством в памяти, если его необходимо перераспределить (std::vector), является ли структура также перераспределенной? или только std::vector?C++ вектор внутри структуры

Например:

struct cluster{ 
    int a; 
    int b; 
    struct cluster* parent; 
    vector<struct cluster> children; 
} 

struct cluster obj = {2,1,...}; 

struct cluster *pobj = &obj; 

for(int i = 0; i < 100 ; i ++){ 
    children.push_back(i); //The capacity will be increased progressly, no? 
} 

Итак, вопрос: есть pobj==&obj в конце for цикла? Или obj перераспределено из-за перераспределения ребенка std::vector объект?

Надеюсь, я объяснил свои сомнения. Спасибо за ваше время.

+0

Возможный дубликат: http://stackoverflow.com/questions/17528855/why-constant-size-of-struct-despite-having-a-vector-of-int – hmjd

+3

Вопрос спорный. Это неопределенное поведение. Вы не можете создать экземпляр 'std :: vector' с неполным типом, который' cluster' находится в точке, где объявляется «childs». – juanchopanza

+0

О, я не понимаю, что ты пытаешься сказать. Я использую эту структуру для просмотра сегментированного изображения, для алгоритма отслеживания цветов. После того, как изображение сегментировано, оно кодируется в RLE. наконец, я получил несколько кластеров пикселей, кодированных в RLE, которые должны быть «родительскими». Первоначально я использовал уникальный родительский и дочерний элементы для каждой структуры, но потом понял, что будут некоторые проблемы с перекрывающимися кластерами ... – Bardo91

ответ

7

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

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

+3

Пока ваша экспликация хороша, насколько это возможно, вы должны указать, что, как написано, его код имеет неопределенное поведение. (Он не компилируется с g ++, если вы используете обычный '-D_GLIBCXX_CONCEPT_CHECKS'.) –

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