Одно из больших различий между C/C++ и Fortran, когда дело доходит до скорости, заключается в том, что первые языки используют указатели, которым можно присваивать псевдонимы, и поэтому компилятору необходимо загружать данные на каждой итерации цикла, в то время как выделяемый Fortran не имеет этой проблемы.
C предлагает ключевое слово restrict
, поэтому вы гарантируете компилятору, что указатель не является псевдонимом. Для c++
стандарт не предлагает эту опцию. Я не хочу использовать расширение поставщика, так как меня беспокоит переносимость, но это также важная часть моего приложения. Следовательно, я не буду полагаться на вещи, выходящие за рамки стандарта, когда они имеют основополагающее значение для моего приложения.
ВОПРОС
Мой вопрос заключается в том, есть ли способ гарантировать компилятору С++, что конкретный аргумент указателя не является псевдонимом. Поможет ли ссылка на C++ (т. е. передача ссылок в качестве аргументов по значению невозможна, поскольку мы имеем дело с очень большими массивами)? Или я должен просто написать эти подпрограммы на C и вызывать их из моего приложения на C++?
void HEAVY_CALC( double *p1, double *p2 , double *p3, int n1)
{
for(int i = 0; i<n1 ; i ++ ) {
p1[i] = Func_1( ) ;
p2[i] = Func_2( ) ;
p3[i]= Func_3( ) ;
}
}
Поскольку указатели здесь могут быть обработаны другими, компилятор будет загружать p1,p2,p3 на каждой i
итерации. В C
, если я добавлю restrict
, это будет разрешено. Что произойдет, если я добавлю ссылку вместо указателя, т.е.
void HEAVY_CALC( double* &p1, double *&p2 , double* &p3, int n1)
Изменит ли это что-нибудь?
__restrict
в качестве расширения. Даже на вики написаноC++ does not have standard support for restrict, but many compilers have equivalents that usually work in both C++ and C
и__restrict is supported by those three compilers.
(например, gcc clang msvc) - person KamilCuk   schedule 10.07.2020