2013-06-25 7 views
1

Как я понимаю restrict, он отмечает, что указатель является единственной ссылкой на конкретные данные внутри функции. Обычно я вижу, что используется в параметрах функции, но это также, кажется, быть полезным:определение переменной как автоматического ограничения

char *restrict a = get_some_string(); 
char *restrict b = get_some_other_string(); 

(так что компилятор знает, что изменение a никогда не изменится b, и может сделать дополнительную оптимизацию).

Если get_some_string возвращает очень сложный тип, представляется полезным использовать ключевое слово auto;

auto a = get_some_string(); 
auto b = get_some_other_string(); 

Но использование auto restrict вызывает ошибку «Ограничить требует указатель». Итак, как я могу их объединить?


Как было отмечено в комментариях, restrict не является стандартом ключевое слово в C++; Я забыл, что у меня есть линия #define restrict __restrict__ в моем проекте, который работает в GCC.

+0

'decltype (get_some_string()) ограничивает a = get_some_string();'? Хотя decltype имеет несколько другое поведение. –

+0

Альтернативное предложение: вместо 'auto' используйте' typedef'. –

+0

@JohnDibling 'typedef' это то, что я использовал. Но я стараюсь не отставать от времени и упрощать свой код! – Dave

ответ

1

Поскольку в комментариях было предложено какое-то решение, я отправлю его здесь для дальнейшего использования; (с дополнениями, чтобы сделать его надежным)

typename std::remove_reference<decltype(get_some_string()[0])>::type *restrict a = get_some_string(); 

Это ужасно. Я буду придерживаться typedef s в этих случаях, но я могу представить, что могут быть ситуации, когда такое поведение необходимо. С макросом становится немного менее страшным:

#define decltype_restrict(x) typename std::remove_reference<decltype((x)[0])>::type *restrict 
decltype_restrict(get_some_string()) a = get_some_string(); 
+0

Из любопытства, почему 'decltype (x [0])' вместо 'decltype (* x)' или 'std :: remove_pointer '? – Angew

+0

@ Нет необходимости. '[0]' было первым, что приходило в голову. 'remove_pointer', вероятно, лучший вариант. – Dave