{
// 2차원 배열
int matrix[3][3] = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
// 2차원 배열 순회
for (int i = 0; i < size(matrix); ++i)
{
for (int j = 0; j < size(matrix[i]); ++j)
{
cout << matrix[i][j] << " ";
}
cout << endl;
}
}
matrix
배열을 3x3 크기로 선언하고 초기화합니다.for
문을 사용하여 2차원 배열을 순회하며 각 요소를 출력합니다.size(matrix)
는 배열의 행 수를 반환합니다.size(matrix[i])
는 배열의 열 수를 반환합니다.{
// 2차원 행렬의 곱셈
int matrix0[3][3] = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
int matrix1[3][3] = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
int matrix2[3][3] = {};
for (int i = 0; i < 3; ++i)
{
for (int j = 0; j < 3; ++j)
{
for (int k = 0; k < 3; ++k)
{
matrix2[i][j] += matrix0[i][k] * matrix1[k][j];
}
}
}
for (int i = 0; i < size(matrix2); ++i)
{
for (int j = 0; j < size(matrix2[i]); ++j)
{
cout << matrix2[i][j] << " ";
}
cout << endl;
}
}
matrix0
와 matrix1
을 선언하고 초기화합니다.matrix2
를 0으로 초기화된 3x3 행렬로 선언합니다.for
문을 사용하여 행렬 곱셈을 수행합니다.matrix2[i][j]
에 matrix0
의 i번째 행과 matrix1
의 j번째 열의 곱셈 결과를 누적합니다.{
// 배열의 메모리
// int[3]
// int, int, int
// int[3][3]
// int, int, int | int, int, int | int, int, int
}
int[3]
의 메모리 구조는 연속된 세 개의 int
값을 가집니다.int[3][3]
의 메모리 구조는 연속된 세 개의 int
배열이 세 번 반복되는 구조입니다.{
// 배열의 복사
int matrix0[3][3] = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
int matrix1[3][3];
// 순회를 이용한 복사
for (int i = 0; i < size(matrix1); ++i)
{
for (int j = 0; j < size(matrix1[i]); ++j)
{
matrix1[i][j] = matrix0[i][j];
}
}
// 함수를 이용한 복사
memcpy(matrix1, matrix0, sizeof(matrix0));
copy(&matrix0[0][0], &matrix0[0][0] + 3 * 3, &matrix1[0][0]);
for (int i = 0; i < size(matrix1); ++i)
{
for (int j = 0; j < size(matrix1[i]); ++j)
{
cout << matrix1[i][j] << " ";
}
cout << endl;
}
}
matrix0
배열을 선언하고 초기화합니다.matrix1
배열을 선언합니다.for
문을 사용하여 배열의 각 요소를 복사합니다.memcpy
함수를 사용하여 배열을 복사합니다.copy
함수를 사용하여 배열을 복사합니다.matrix1
배열을 출력합니다.{
// 캐싱에 따른 순회 속도의 차이 비교
// 시간 지역성, 공간 지역성
int sum = 0;
for (int i = 0; i < 20240; ++i)
{
for (int j = 0; j < 20240; ++j)
{
sum += gMatrix[i][j]; // 빠름
sum += gMatrix[j][i]; // 느림
}
}
}
gMatrix
는 전역적으로 선언된 20240x20240 크기의 2차원 배열입니다.sum += gMatrix[i][j];
는 메모리의 공간 지역성에 의해 캐시 히트율이 높아 빠르게 수행됩니다.sum += gMatrix[j][i];
는 캐시 미스가 많아 상대적으로 느리게 수행됩니다.캐시 메모리는 CPU와 메인 메모리 사이에 위치하여 메모리 접근 속도를 줄여주는 역할을 합니다. 캐시 메모리는 지역성을 활용하여 성능을 향상시킵니다.
위의 예제에서는 gMatrix[i][j]
순회는 행 우선 접근으로 연속된 메모리 위치에 접근하므로 캐시 히트가 발생하여 빠르게 수행됩니다. 반면, gMatrix[j][i]
순회는 열 우선 접근으로 연속되지 않은 메모리 위치에 접근하므로 캐시 미스가 많아 상대적으로 느리게 수행됩니다.
이 예제에서는 다차원 배열의 선언, 초기화, 순회, 복사 및 행렬 곱셈을 다룹니다. 또한 캐시 메모리의 시간 지역성과 공간 지역성을 활용한 성능 최적화 방법을 보여줍니다. 다차원 배열을 효율적으로 사용하려면 메모리 접근 패턴을 고려하여 캐시 히트율을 높이는 것이 중요합니다.