, 나는 걸릴하려는 접근 방식은 그럼 난 배열에 액세스 할 수있는 템플릿 클래스를 만들 것
new unsigned char[<max size in bytes>]
를 사용하여 메모리를 할당하는 것입니다. 당신은 단순히 m_array에 액세스하려는 게터/setter 메소드의 당신의 템플릿 구현에
template<class ElementType, int numBytes>
class DynamicArray
{
public:
DynamicArray(unsigned char* buffer);
ElementType& Get(long index);
void Set(long index, const ElementType &element);
private:
ElementType* m_array;
};
:처럼 뭔가. sizeof (ElementType)를 곱한 다음 numBytes보다 작은 지 확인하여 인덱스가 유효한지 확인합니다.
생성자는 단순히 버퍼를 ElementType *으로 캐스팅하여 m_array에 할당합니다.
당신은 다음 바이트를 사용하여 배열을 할당하고 thusly 히 다른 형식에 액세스 할 수 있습니다 :이 방법으로 그것을 할 것
unsigned char* buffer = new unsigned char(1000);
DynamicArray<long, 1000> longArray(buffer);
long val = 10;
longArray.Set(0, val);
longArray.Get(0);
DynamicArray<short, 1000> shortArray(buffer);
short firstTwoBytes = shortArray.Get(0);
etc.
이유는 당신에게 최대 컴파일 타임 타입 안전성을 제공한다는 것입니다. 이것이 C++ 템플릿이 실제로 잘하는 한 가지입니다. 위의 코드에서 설명한 것처럼이 템플리트 클래스의 여러 인스턴스에 동일한 버퍼를 사용할 수 있습니다. 컴파일을 시도하지 않았으므로 구문 오류가 있으면 사과드립니다.
그런데 연산자 오버로드를 사용하면 배열 접근자가 'C'배열처럼 보이게 할 수 있습니다. 예제는 STL의 "vector"클래스를 참조하십시오.
인라인 asm을 사용하고 인덱스 레지스터에 직접 액세스하는 것이 배열 액세스에 void 포인터를 사용하는 것보다 훨씬 더 일반적이라는 사실을 알려주십시오. –
예를 들어 주시겠습니까? 내가 컴파일 할 수있는 코드 조각. 감사! – zhen
이전 질문과 다른 점은 무엇입니까? http://stackoverflow.com/questions/2212506/how-do-you-use-a-void-pointer-to-generate-2d-dynamic-array – interjay