Читать «Стандарты программирования на С++. 101 правило и рекомендация» онлайн - страница 124
Андрей Александреску
Обсуждение
Сегодня едва ли не основными вопросами при написании программного обеспечения являются вопросы безопасности и переполнения буфера. Ограничения, связанные с фиксированным размером массивов, доставляют немало беспокойства, даже если приложению удается остаться в рамках корректности. Все эти проблемы связаны с использованием старых средств С, таких как встроенные массивы, указатели и их арифметика, а также управление памятью вручную вместо таких высокоуровневых концепций, как буферы, векторы и строки.
Вот некоторые из причин, по которым массивам в стиле С следует предпочесть стандартные средства С++.
• reallос
и соответствующих обновлений указателей.
•
• vector
и string::c_str
могут быть переданы функциям API на языке С. В частности, в С++ vector
служит "переходником" к С и другим языкам программирования (см. рекомендации 76 и 78).
•
• vector
и string
при выборе между эффективностью и безопасностью решение принимается в пользу эффективности (естественно, не в отладочном режиме). Тем не менее, стандартные средства оказываются гораздо лучшей платформой для создания безопасных компонентов, чем обычные массивы и указатели.
•
Применение массива может быть оправданно, когда его размер фиксирован на стадии компиляции (например, float[3]
для трехмерной точки; переход к четвертому измерению все равно потребует перепроектирования программы).
Ссылки
78. Используйте vector
(и string::c_str
) для обмена данными с API на других языках
Резюме
vector
и string::c_str
служат шлюзом для сообщения с API на других языках. Однако не полагайтесь на то, что итераторы являются указателями; для получения адреса элемента, на который ссылается vector<T>::iterator iter
, используйте выражение &*iter
.
Обсуждение
vector
(в первую очередь) и string::c_str
и string::data
(во вторую) представляют собой наилучшие способы обмена данными с API на других языках вообще и с библиотеками на С в частности.