2011-02-16 7 views
2

__restrict__ 한정자에 2 차원 배열 참조를 지정하는 적절한 방법은 무엇입니까? 예를 들어 :배열 참조에 대한 C++ 제한 한정자

void function(double (&)[3][3]); 

는 지금까지 내가 말할 수있는, g++ 다음 (하지만 성능 차이) 컴파일하지 :

void function(double (& __restrict__)[3][3]); 

이 올 것을입니다을?

전체 세그먼트 :

template<class A, class B, class C> 
static void 
multiply(const A (&a)[L][L], const B (&b)[L][L], 
     C (&c)[L][L]) { 
// C (&__restrict__ c)[L][L]) { 
    for (size_t j = 0; j < L; ++j) { 
     // C __restrict__ *cj = c[j]; 
     for (size_t k = 0; k < L; ++k) { 
      double b_jk = b[j][k]; 
      for (size_t i = 0; i < L; ++i) { 
       c[j][i] += a[k][i]*b_jk; 
       // cj[i] += a[k][i]*b_jk; 
      } 
     } 
    } 
} 
+0

C에서 참조가 없기 때문에 C 태그를 제거했습니다. 어떤 컴파일러가 C++에서이'__restrict__'를 지원합니까? 표준 C++의 일부는 아닙니다. –

+0

James가 말했습니다. 참조는 C++에서만 가능하며'restrict' (밑줄 없음)는 C입니다. C 또는 C++ 확장을 사용하려는 경우 환경을 명시해야합니다. –

+0

@James gcc, xlc, icc. http://stackoverflow.com/questions/776283/what-does-the-restrict-keyword-mean-in-c – Anycorn

답변

0

__restrict__은 포인터를 사용할 수 있습니다. 포인터를 사용하여 2 차원 배열을 시뮬레이션 할 수도 있습니다. some_array[x][y] 대신 some_array[x*w + y]처럼 some_array는 double *some_array[w]으로 정의됩니다. 나는 그것이 작동해야한다고 생각합니다 ...

하지만 솔직히, 왜 심지어 제한 할 필요가 있습니까?

+0

물론, 포인터에 충분한 공간을 할당해야합니다. – rmrf

+1

C++에서 포인터의 별칭을 가정하고이 특정 사례에서 말할 수있는 한까지. – Anycorn

+0

사실 제한된 참조를 가질 수 있습니다. 그것은 단지 컴파일러에 달려 있습니다. GCC는 참조에 '__restrict__'지정자를 허용합니다 : http://gcc.gnu.org/onlinedocs/gcc/Restricted-Pointers.html – CoffeeandCode

관련 문제