Всегда ли безопасно заменять встроенный массив массивом std/tr1/boost ::?

boost::array (or the tr1or std version) offer some nice additional features over a built-in array.

До сих пор наша база кода содержала только встроенные массивы, например (составлено, но стиль соответствует):

WORD m_lastReadFlags[FLAGS_MAX];
...
WORD flagBuffer[FLAGS_MAX];
if (getFlags(flagBuffer)) {
  memcpy(m_lastReadFlags, flagBuffer, sizeof(m_lastReadFlags));
  ...

Я думаю, что вы поймете эту идею.

Теперь, мой вопрос заключается в том, что для тех мест в коде, где сброс в boost :: array имеет смысл (из-за других изменений), это array 100% сохранение семантики для встроенного массива? (Возможные ошибки компилятора в порядке - только молчание поведенческих изменений - это то, что меня беспокоит.)

То есть может переписать код выше (например):

boost::array m_lastReadFlags;

and the memcpy (possibly adapted to use c_array()or data()) and other array-like access would remain the same? Yes, of course I could also replace the local buffer by an array and remove the memcpy or use std::copy or something like that, but the point of this question is about the compatibility of built-in arrays and the array class.


Обновление. Одна вещь, которая меня беспокоит, это места (например, в случае memcpy ), где встроенные массивы используются в качестве указателей. Будут ли все случаи компилятор/обработан правильно?

Как насчет назначения?

T arr1[N];//or array
T arr2[N];//or array
T* p1;
...
// Note, not all combinations will compile:
arr1 = arr2;
p1 = arr1;
arr2 = p1;
...
5

1 ответы

Да, это должно быть хорошо, поскольку класс array - это как раз оболочка для автоматического массива. Он имеет тот же синтаксис доступа с квадратными скобками, и если вам нужно получить указатель, вы знаете, как это сделать. Вы даже можете использовать std :: copy всюду и использовать итераторы; скорее всего, это будет реализовано memcpy в любом случае.

Класс array имеет тип aggregate type (нет нетривиальных конструкторов/деструктор/назначение), поэтому вы можете инициализировать его с помощью традиционного инициализатора совокупности (скобки), как и простой массив.

5
добавлено
pro.cxx
pro.cxx
3 049 участник(ов)

C/C++ chat 0. Простые вопросы, лабы и о IDE — в чат новичков @supapro 1. Не хамим, не переходим на личности, не вбрасываем утверждения без доказательств 2. No Ads, offtop, flood Объявления о вакансиях и евенты - в лс @AlexFails https://t.me/ProCxx/259155

supapro.cxx
supapro.cxx
1 925 участник(ов)

Чат для тех, кто немного знает C++, простые вопросы по реализации, синтаксису и ide – сюда, а для другого есть: /Главный чат по серьезным вопросам — @ProCxx /Чат по обсуждению всего — @fludpac

C++ Russia
C++ Russia
384 участник(ов)

Сообщество разработчиков C++ в Telegram.

cxx.Дискуссионная
cxx.Дискуссионная
298 участник(ов)

это не двач, общайтесь вежливо; разговор на почти любые темы; Не согласны с баном? В лс @AlexFails, @ivario

C++ для маленьких и тупых
C++ для маленьких и тупых
105 участник(ов)

Лоу левел (по среднему IQ участников) чатик ExtremeCode @extremecode Флудилка @extremecode_rest