База ответов ИНТУИТ

Программирование на С/С++

<<- Назад к вопросам

Почему в объявлении POSIX функции memmove() и memcmp() для параметров не используется ключевое слово restrict, а для memcpy используется?

(Отметьте один правильный вариант ответа.)

Варианты ответа
для функций memmove() и memcmp() нельзя гарантировать что передаваемые в функцию через указатели участки памяти не имеют пересечения(Верный ответ)
указатели в функциях memmove() и memcmp() не могут быть константными
не на всех платформах функции memmove() и memcmp() могут быть оптимизированы
для функций memmove() и memcmp() внутри функции возможна модификация всех передаваемых областей памяти
Похожие вопросы
Где и для чего используется ключевое слово restrict?
Каковы условия контракта, который заключается с компилятором использованием ключевого слова restrict при объявлении указателя?
Для чего используется атрибут aligned компилятора gcc?
В каких случаях используется идиома «Конверт/письмо»?
Для разработки каких классов программ широко используется язык С?
Что описывает стандарт POSIX?
Результаты каких функций POSIX необходимо проверять?
<pre> //====================== start of sample.cpp ========================== #include &lt;type_traits&gt; template &lt;typename IT_1, typename IT_2, bool b&gt; IT_2 copy_imp(IT_1 first, IT_1 last, IT_2 out, const std::integral_constant&lt;bool, b&gt;&amp;) { while(first != last) { *out = *first; ++out; ++first; } return out; } template &lt;typename T&gt; T* copy_imp(const T* first, const T* last, T* out, const std::true_type&amp;) { memmove(out, first, (last-first)*sizeof(T)); return out * (last-first); } template &lt;typename I1, typename I2&gt; inline I2 copy(I1 first, I1 last, I2 out) { typedef typename std::iterator_traits&lt;I1&gt;::value_type value_type; return copy_imp(first, last, out, std::has_trivial_assign&lt;value_type&gt;()); } class A {}; int main() { std::vector&lt;A&gt; vec1; std::vector&lt;A&gt; vec2; copy(vec1.begin(), vec1.end(), vec2.begin()); return 0; } //====================== end of sample.cpp ========================== </pre> Какие утверждения про то какая функция копирования copy_impl() будет использована верны?
<pre> //====================== start of sample.cpp ========================== #include &lt;type_traits&gt; template &lt;typename IT_1, typename IT_2, bool b&gt; IT_2 copy_imp(IT_1 first, IT_1 last, IT_2 out, const std::integral_constant&lt;bool, b&gt;&amp;) { while(first != last) { *out = *first; ++out; ++first; } return out; } template &lt;typename T&gt; T* copy_imp(const T* first, const T* last, T* out, const std::true_type&amp;) { memmove(out, first, (last-first)*sizeof(T)); return out * (last-first); } template &lt;typename I1, typename I2&gt; inline I2 copy(I1 first, I1 last, I2 out) { typedef typename std::iterator_traits&lt;I1&gt;::value_type value_type; return copy_imp(first, last, out, std::has_trivial_assign<value_type>()); } class A {}; int main() { std::vector&lt;short&gt; arr1; std::vector&lt;short&gt; arr2; copy(arr1.begin(), arr1.end(), arr2.begin()); return 0; } //====================== end of sample.cpp ========================== </pre> Какие утверждения про используемую функцию копирования copy_impl() верны?
Почему лучше использовать исключения, унаследованные от стандартных исключений?