Всегда ли безопасно заменить встроенный массив на std / tr1 / boost :: array? - PullRequest
5 голосов
/ 28 октября 2011

boost::array (или версия tr1 или std) предлагают несколько приятных дополнительных функций по сравнению со встроенным массивом.

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

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<WORD, FLAGS_MAX> m_lastReadFlags;

, а memcpy (возможно, адаптированный для использования c_array() или data()) и другой доступ в виде массива останется прежним? Да, конечно, я мог бы также заменить локальный буфер массивом и удалить memcpy или использовать std::copy или что-то в этом роде, но суть этого вопроса заключается в совместимости встроенных массивов икласс массива.


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

А как насчет присваивания?

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

1 Ответ

5 голосов
/ 28 октября 2011

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

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

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