Для всех широко используемых в последнее время posix-совместимых систем, то есть для Windows, Linux (и Android ofc.) И MacOSX, применяются следующие условия:
Возможно ли использовать malloc ()для динамических массивов в C ++?
Да, это так.Лучше всего использовать reinterpret_cast
для преобразования результирующего void*
в требуемый тип указателя, и это приводит к динамически распределенному массиву, подобному следующему: type *array = reinterpret_cast<type*>(malloc(sizeof(type)*array_size);
Будьте осторожны, чтобы в этом случае конструкторы не вызывалисьэлементы массива, поэтому это все еще неинициализированное хранилище, независимо от того, что является type
.Деструкторы также не вызываются, когда free
используется для освобождения
Возможно ли использовать оператор new () и размещение нового для динамических массивов в более старом C ++, который не имеет ключевого слова alignas?
Да, но вы должны знать о выравнивании в случае размещения нового, если вы вводите его в пользовательских местах (то есть тех, которые не происходят из malloc / new).Обычный оператор new, также как и malloc, предоставит собственные области памяти с выравниванием по словам (по крайней мере, когда размер выделения> = wordsize).Этот факт и тот факт, что структура макетов и размеров определяется так, чтобы выравнивание учитывалось правильно, вам не нужно беспокоиться о выравнивании массивов dyn, если используется malloc или new. Можно заметить, что размер слова иногда значительно меньше, чем самый большой встроенный тип данных (который обычно long double
), но он должен быть выровнен таким же образом, поскольку выравнивание - это не размер данных, абитовая ширина адресов на шине памяти для разных размеров доступа.
Является ли указатель арифметическим неопределенным поведением при использовании над памятью, возвращаемым оператором new ()?
Нет, пока вы уважаете границы памяти процесса - с этой точки зрения new
в основном работает так же, как malloc
, более того, new
фактически вызывает malloc в подавляющем большинстве реализаций в порядкеприобрести необходимую площадь.На самом деле, арифметика указателей как таковая никогда не является недействительной.Однако результат арифметического выражения, которое оценивает указатель, может указывать на местоположение за пределами разрешенных областей, но это не ошибка арифметики указателя, а ошибочное выражение.
Саттер советует код, который может сломаться на какой-нибудь античной машине?
Я так не думаю, если используется правильный компилятор.(не компилируйте инструкции avr или 128-битные модули памяти в двоичный файл, предназначенный для работы на 80386). Конечно, на разных машинах с разным объемом памяти и разметкой один и тот же литеральный адрес может получить доступ к областям разного назначения / статуса./ существование, но зачем вам использовать буквенные адреса, если вы не пишете код драйвера для конкретного оборудования? ...:)