У меня есть общее представление о restrict
, но я надеюсь уточнить некоторые моменты. У меня есть функция, которая считывает строку с нулевым завершением из одного буфера и выписывает версию с кодировкой URL в другом буфере. Функция имеет эту подпись (без restrict
):Когда использовать ограничение и когда не
char const *StringUrlEncode(char const *unencoded,
char *encoded,
char *encodedEnd);
unencoded
мой завершающим нулем исходной строки. Буфер назначения представлен encoded
и encodedEnd
, где encoded
указывает на первый char
в буфере и encodedEnd
указывает на первый символ после буфера т.е. функция будет писать char
s до, но не включая место указал до encodedEnd
- это ваша основная пара итераторов begin
/end
, если вы знакомы с соглашениями STL на языке C++.
Если добавить restrict
к этой функции, она должна применяться только к первым двум параметрам:
char const *StringUrlEncode(char const *restrict unencoded,
char *restrict encoded,
char *encodedEnd);
или есть какая-то польза, я не понимая, добавляя его по всем трем параметрам?
Я вижу, что создание входных и выходных буферов restrict
помогает компилятору понять, что они не перекрываются. Но поскольку последний параметр, encodedEnd
, используется только для обозначения конца выходного буфера, я думаю, что restrict
на самом деле не будет никакой помощью для компилятора здесь (хотя я предполагаю, что это не повредит, кроме добавления ненужный шум для объявления функции).
Я прочитал статью Майка (дважды сейчас), и это хорошее начало, но оставил мне несколько вопросов :-) –
Указанная ссылка нефункциональна. Google предлагает обновленную версию по адресу http://cellperformance.beyond3d.com/articles/2006/05/demystifying-the-restrict-keyword.html (проверено 2009-09-06), но это также создает проблемы. Кэшированная версия доступна в Google. –