Всегда ли векторы C ++ смежны?

Возможный дубликат:
являются std :: vector элементы гарантированно непрерывны?

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

Однако я по-прежнему скептически отношусь к тому, останется ли этот подход устойчивым для вектора любого размера, особенно когда вектор вырастает до определенного размера, когда это предположение может нарушиться.

Ниже приведен пример того, о чем я говорю:

MPI_Recv( &partials[0] , partials.size() , mpi_partial , 0, 
         DALG_ELIMINATE_REQ_MSG ,MPI_COMM_WORLD , &status );

person cpp_noname    schedule 30.09.2011    source источник
comment
Какой вопрос? Какую именно проблему вы хотели бы, чтобы мы помогли вам решить?   -  person Doug T.    schedule 30.09.2011
comment
^ Я просто обожаю такие ответы. Всегда вызывает ощущение, что тебя допрашивают копы: P   -  person Sadique    schedule 30.09.2011
comment
У меня такое ощущение, что он не читал заголовок вопроса и полагался на описание вопроса.   -  person Ayjay    schedule 30.09.2011
comment
@Ayjay, я виноват в исправлении названия ...   -  person Roddy    schedule 30.09.2011
comment
Привет, Тесто Т. Я просто не уверен в том предположении, которое, как утверждают эти люди, верно. Я не хочу рисковать использованием векторов вместо обычных массивов, чтобы позже узнать, что мое программное обеспечение выходит из строя из-за того, что вектор стал слишком большим и начинает беспорядочно разбрасывать элементы в памяти.   -  person cpp_noname    schedule 30.09.2011
comment
@SteveJessop, согласен, я думал, что это реальный вопрос, только не совсем так :(   -  person Roddy    schedule 30.09.2011
comment
@takwing: Вопрос, на который ссылается в комментарии, содержит цитату из стандарта в качестве ответа, чего еще вы хотите? Если вы считаете, что реализация не соответствует стандарту, вам придется проверить реализацию самостоятельно, поскольку у вас, вероятно, также возникнут сомнения, когда мы заверяем вас, что все реализации действительно соответствуют стандарту.   -  person PlasmaHH    schedule 30.09.2011
comment
@ Стив Джессоп - Я очень ценю то, что вы сказали, сэр, но, честно говоря, я не вижу согласованности среди многих членов SO с большим количеством представителей, иногда они закрывали правильные вопросы без нужды. В этом отношении пользователи должны быть последовательны.   -  person Sadique    schedule 30.09.2011
comment
@takwing: Проверьте ответы на вопрос, на который указал Стив. Короче говоря, стандарт C ++ определяет векторы как смежные.   -  person Roddy    schedule 30.09.2011
comment
@takwing: vector не разбрасывает элементы случайным образом, но все это при необходимости перемещается. Таким образом, будет ли такое использование безопасным, зависит от того, что вы имеете в виду под «ростом» - если вы имеете в виду, что в будущем ваша программа будет использовать больший размер, чем сегодня, прекрасно. Если вы имеете в виду, что вызываете resize, пока MPI удерживает указатель, это не нормально.   -  person Steve Jessop    schedule 30.09.2011
comment
@Acme: Определенная несогласованность неизбежна: пользователям SO не нужно запоминать правила; правила субъективны и время от времени меняются без уведомления пользователей; случаются ошибки понимания; закрытые голоса не могут быть удалены, если вопрос прояснен. Если действительный вопрос закрывается, это досадно, но люди могут скрывать ответы в комментариях, голосовать за повторное открытие или снова задавать вопрос позже, когда в сети находятся другие люди. ТАК работает хорошо, но не идеально.   -  person Steve Jessop    schedule 30.09.2011


Ответы (3)


Да, векторы C ++ всегда смежны, независимо от размера.

Но это не означает, что они не перемещаются в памяти, когда вы их сжимаете или расширяете ...

person Roddy    schedule 30.09.2011

В рабочем проекте C ++ (www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3126.pdf) говорится в 23.4.1:

Элементы вектора хранятся непрерывно, что означает, что если v - вектор, где T - некоторый тип, отличный от bool, то он подчиняется тождеству & v [n] == & v [0] + n для всех 0 ‹= n‹ v .размер().

person Patrick    schedule 30.09.2011

В основном да. Все реализации, о которых я знаю, есть, и стандарт требует, чтобы вектор имел поиск O [1], что в основном требует непрерывного блока памяти.

Стандартный отказ от ответственности "не следует полагаться на детали реализации".

person Ayjay    schedule 30.09.2011
comment
Фактически, он явно требует, чтобы вектор использовал непрерывный макет. - person sellibitze; 30.09.2011