Рассмотрим следующий (немного задуманную) пример:Маркировка функции, как не имеющие каких-либо побочных эффектов, с помощью Visual C++
// a.cpp
int mystrlen(const char* a) {
int l = 0;
while (a[l]) ++l;
return l;
}
// b.cpp
extern int mystrlen(const char*);
int foo(const char* text) {
return mystrlen(text) + mystrlen(text);
}
Было бы очень хорошо, чтобы быть в состоянии сказать компилятору, что mystrlen()
не имеет побочные эффекты и, следовательно, он может повторно использовать старый результат от mystrlen(text)
вместо вызова его дважды.
Я не нахожу ничего в документах об этом и restrict
, либо одна из его дисперсий, похоже, не выполняет эту работу. Взгляд на выходной код со всеми оптимизациями (переключатель /Ox
) показывает, что компилятор действительно генерирует два вызова. Это даже делает, если я поместил обе функции в один модуль.
Любое решение этого или может кто-нибудь подтвердить, что в VC++ нет решения?
Вы хотите более функциональный язык. – SLaks
Это делает это (назовите это дважды), даже если вы включите всю оптимизацию? И что, если он находится в одном исходном файле? Еще такой же результат? – Floris
@Floris: Я использовал '/ Ox', и даже если в одном модуле он дважды выполняет функцию. – cxxl