문제

이에서 나온 이 대답하여 이전 질문의 내.그것은 보장을 위한 컴파일러를 치료하는 array[4][4]array[16]?

예를 들어,아래와 같은 전화 api_func() 안전할까요?

void api_func(const double matrix[4][4]);

// ...

{
  typedef double Matrix[4][4];

  double* array1 = new double[16];
  double array2[16];

  // ...

  api_func(reinterpret_cast<Matrix&>(array1));
  api_func(reinterpret_cast<Matrix&>(array2));
}
도움이 되었습니까?

해결책

에서는 C++표준을 참조하여 sizeof 운영자:

에 적용될 때는 배열의 결과가 총 수의 바이트 배열입니다.이 의미는 배열의 크기의 nn 배 크기의 요소입니다.

이에 내가 말하는 double[4][4]double[16] 해야가 동일한 근본적인 표현입니다.

I.e., 어

sizeof(double[4]) = 4*sizeof(double)

sizeof(double[4][4]) = 4*sizeof(double[4])

그런 다음 우리는

sizeof(double[4][4]) = 4*4*sizeof(double) = 16*sizeof(double) = sizeof(double[16])

내가 생각하는 표준을 준수하는 컴파일러를 구현하는 이러한 동일한,그리고 나는 생각이 뭔가 하지 않는 컴파일러가 실수로 휴식입니다.표준을 구현하기 위한 다중 차원 어레이 예상대로 작동합니다.을 깨는 표준이 필요한 추가 작업을 위해,가능성이 없는 혜택입니다.

C++표준 또는 배열 구성의 연속적으로 할당되는 요소는 가능성을 제거하고의 이상한 것을 사용하여 포인터와 편리합니다.

다른 팁

나는 생각하지 않는 문제가 있으로 패딩이 도입함으로써 다차원 배열입니다.

각 요소에 배열을 충족해야 합 패딩 요구 사항에 의해 부과됩니다.배[N][M]는 항상 동일한 메모리에 표현으로 하나의[M*N].

각 배열 요소를 배치해야한다 순차적으로 메모리에는 컴파일러에 의해.두 개의 선언을 하는 동안 다른 유형은 동일한 기본 메모리 구조입니다.

@콘라드 루돌프:

나는 그 두 가지(행 주요/열 주요)혼합한 자신을,그러나 나는 이것:그것의 잘 정의됩니다.

int x[3][5],예를 들어,배열의 크기 3,의 요소가에 int 배열의 크기가 5.(§6.5.2.1)추가하면 모든 규칙에서 표준에 대한 어레이,주소,등등.당신은 그 두 번째는 아래 첨자 참 연속된 정수,wheras 첫 번째 아래 첨자를 참조 연속 5-int 개체입니다.(이렇게 3 은 더 큰 번호당신이 5 일 간의 수 x[1][0] x[2][0].)

가 패딩이 추가되고있는 것처럼 매트릭스[5][5]각각의 행 단어를 정렬하지만,할 수 있는 단순히 내 자신의 미신이다.

더 큰 문제는:당신은 정말 당신을 수행 할 필요가 이러한 캐스팅?

지만 당신 을 얻을 수 있다,그것은 여전히 읽을 수 있고 유지 관리를 방지합니다.예를 들어,당신은 지속적으로 사용 double[m*n]으로 실제 형식으로 작업하는 클래스 랩 이 유형이며,아마도 오버로드[]연산자의 편의를 위해 사용.는 경우에,당신이해야 할 수도 있습의 중간 클래스를 캡슐화하는 단일 행-그래서 다음과 같은 코드를 my_matrix[3][5]아직도 예상대로 작동합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top