이것은 실제로 설명하기가 매우 어렵지만, 나는 그것을 갈 것입니다 ...
먼저 배열 dimof
의 차원 또는 요소 수를 알려줍니다 . ( "차원"은 Windows 프로그래밍 환경에서 선호되는 용어라고 생각합니다).
때문에 필요 C++
하고 C
당신에게 배열의 크기를 결정하는 기본 방법을 제공하지 않습니다.
종종 사람들은 효과 sizeof(myArray)
가 있다고 생각 하지만 실제로는 요소 수보다는 메모리 크기를 제공합니다. 각 요소는 아마도 1 바이트 이상의 메모리를 필요로합니다!
다음으로 시도해 볼 수 있습니다 sizeof(myArray) / sizeof(myArray[0])
. 이것은 배열의 메모리의 크기를 첫 번째 요소의 크기로 나눈 것입니다. 괜찮고 C
코드 에서 널리 사용됩니다 . 이것의 주요 문제는 배열 대신 포인터를 전달하면 작동하는 것처럼 보입니다. 메모리에서 포인터의 크기는 일반적으로 4 또는 8 바이트이지만, 1000의 요소로 구성된 배열 일 수도 있습니다.
따라서 다음으로 시도해야 할 것은 C++
템플릿을 사용하여 배열에서만 작동하는 것을 강제하고 포인터에 컴파일러 오류를 발생시키는 것입니다. 다음과 같이 보입니다 :
template <typename T, std::size_t N>
std::size_t ArraySize(T (&inputArray)[N])
{
return N;
}
//...
float x[7];
cout << ArraySize(x); // prints "7"
템플릿은 배열에서만 작동합니다. 유형 (실제로 필요하지는 않지만 템플릿이 작동하도록해야 함)과 배열의 크기를 추론 한 다음 크기를 반환합니다. 템플릿을 작성하는 방법은 포인터로 작동 할 수 없습니다.
일반적으로 여기서 멈출 수 있으며 이것은 C ++ 표준 라이브러리에 있습니다 std::size
.
경고 : 여기 아래는 털이 많은 언어 변호사 영역에 들어갑니다.
이것은 꽤 멋지지만, 모호한 경우에는 여전히 실패합니다.
struct Placeholder {
static float x[8];
};
template <typename T, int N>
int ArraySize (T (&)[N])
{
return N;
}
int main()
{
return ArraySize(Placeholder::x);
}
배열 x
은 선언 되었지만 정의 되지 않았습니다 . 함수 (즉, 호출하려면 ArraySize
그것을) x
해야 정의 .
In function `main':
SO.cpp:(.text+0x5): undefined reference to `Placeholder::x'
collect2: error: ld returned 1 exit status
이걸 연결할 수 없습니다.
질문에있는 코드는 그 주위에 방법입니다. 실제로 함수를 호출하는 대신 정확한 크기의 객체 를 반환하는 함수를 선언합니다 . 그런 다음 그 sizeof
트릭을 사용합니다 .
그것은 보이는 우리가 함수를 호출처럼,하지만 sizeof
기능은 결코 실제로 호출되는, 그래서 순수하게 컴파일 시간 구조입니다.
template <typename T, size_t N>
char(&DimofSizeHelper(T(&array)[N]))[N];
^^^^ ^ ^^^
// a function that returns a reference to array of N chars - the size of this array in memory will be exactly N bytes
실제로 함수에서 배열을 반환 할 수는 없지만 배열에 대한 참조를 반환 할 수 있습니다.
이어서 DimofSizeHelper(myArray)
인 표현 그 종류 에 배열 N
char
들. 표현식을 실제로 실행할 필요는 없지만 컴파일 타임에 의미가 있습니다.
따라서 실제로 함수를 호출하면 얻을 수있는 것의 컴파일 타임 에 크기를sizeof(DimofSizeHelper(myArray))
알려줍니다 . 실제로 전화하지는 않지만.
마지막 블록이 이해가되지 않더라도 걱정하지 마십시오. 기괴한 가장자리 사건을 해결하는 것은 기묘한 트릭입니다. 그렇기 때문에 이런 종류의 코드를 직접 작성하지 말고 라이브러리 구현자가 이러한 종류의 말도 안되는 것에 대해 걱정하게하십시오.
std::array
std::vector