문제
이에서 나온 이 대답하여 이전 질문의 내.그것은 보장을 위한 컴파일러를 치료하는 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
운영자:
에 적용될 때는 배열의 결과가 총 수의 바이트 배열입니다.이 의미는 배열의 크기의
n
소n
배 크기의 요소입니다.
이에 내가 말하는 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]아직도 예상대로 작동합니다.