C ++에서 Delphi로 코드를 포팅하는 과정에서 종종 STL 컬렉션을 사용하여 포트 코드가 필요합니다. 델파이가 제공하는 컬렉션 세트는 매우 금욕 적이므로 때로는
적절한 교체를 찾기가 어렵습니다. 때로는 객체가 스택에 배치되거나 자체 메모리 할당자를 사용하는 코드를 만날 수 있습니다.
제안 된 데이터 새로 고침 모드를 정말 싫어합니다. 데이터를 업데이트하려면 컬렉션에서 배치 된 값을 검색하고 값을 업데이트 한 다음 변경된 값을 다시 넣어야합니다. 이를 위해서는 두 가지 이상의 추가 복사 작업이 필요합니다. 데이터 항목을 VAR 매개 변수로 절차에 전달할 수 없습니다.
컬렉션이 메모리가 할당되는 방식을 바꿀 방법은 없습니다. 개체 및 레코드에 대한 메모리는 하나의 공유 힙에서 할당됩니다. 사용 후 메모리를 신중하게 힙으로 반환해야합니다. 메모리를 올바르게 자유롭게하는 것이 항상 사소한 작업이 아니며, 프로세서 시간과 프로그래머 가이 코드를 작성하는 데 시간이 걸립니다. STL에서는 모든 종류의 컬렉션에 대해 자신의 메모리 할당자를 지정할 수 있습니다.
이 구현은 레코드 및 포인터에 의존합니다. 지금까지 표준 객체를 사용하고 싶은 것을 구현할 방법이 없습니다. 물체의 생성 및 파괴는 공유 메모리 더미를 사용합니다. 통화 스택에 객체를 배치 할 수있는 방법이 없습니다. 좋은 오래된 "객체"는 더 이상 사용되지 않으며이 유형에 대한 새로운 기능을 추가하는 것은 지원되지 않습니다.
이 컬렉션 구현은 유형 메모리 영역을 기반으로 한 메커니즘 메모리 관리에 의존합니다. 유형 메모리 영역을 사용하면 여러 작업의 솔루션을 단순화 할 수 있습니다.
메모리를 해제하는 작업이 쉬워지고 훨씬 빨리 수행 할 수 있습니다.
표준 메모리 관리자가 스레드 안전이어야한다는 것은 잘 알려진 사실입니다. 주어진 시간에 하나의 스레드 만 메모리 관리자에 액세스 할 수 있습니다. 메모리 할당 및 자유화 메모리는 상호 배제 메커니즘을 사용하며 특히 메모리가 크게 훼손된 경우 빠른 작동이 아닙니다. 별도의 유형 메모리 영역을 사용할 때, 우리는 필요한 메모리를 늘리고 사용 후 구조를 삭제하는 순간에만 표준 메모리 관리자를 참조합니다.
메모리 할당자를 지정하는 기능을 갖춘 기본 구조에 대한 지원. 목록의 요소는 포인터를 통해 액세스됩니다. 일반적으로 값에 대한 메모리는 소위 세그먼트 메모리 영역에 위치하며 작동 중에 이동하지 않습니다. 영역의 메모리를 늘릴 필요가있는 경우 추가 메모리 세그먼트가 할당됩니다. 이는 포인터를 통해 해당 지역에 위치한 데이터 항목에 액세스 할 수 있음을 의미합니다.
배열의 경우 소위 연속 메모리 영역을 사용합니다. 데이터 항목은 인덱스를 통해 액세스합니다. 필요한 경우 영역의 메모리를 높이면 큰 크기의 세그먼트가 할당되고 현재 메모리 세그먼트의 데이터가 새 세그먼트에 복사됩니다. 데이터를 복사하면 이전 세그먼트가 삭제됩니다.
궁극적으로 포인터를 통해 작업하는 것은 매우 편리하고 효율적입니다. 코드는 훨씬 간단하고 간결 해집니다. 그러나 포인터에 대한 경험이 없다면 "발에 자신을 쏘는 것이 쉽습니다". 캡슐화 팬의 경우 원하는 구조를 개인 필드로 집계 할 수 있습니다. 다음으로, 우리는 공개 섹션에서 필요한 방법과 속성을 재정의하여 인터페이스의 필요한 부분 만 열립니다. 인라인 옵션을 넣으면 추가 비용을 피합니다. 델파이 컴파일러는 재정의 메소드에 대한 코드를 생성하지 않습니다. 메소드 호출 대신 집계 구조 방법에 대한 직접 호출이 있습니다.
TsgTuple<T1, ...> 일반 튜플TsgArray<T> 일반 배열TsgList<T> 일반 값 목록TsgRecordList<T> 포인터에 의해 액세스 된 값의 일반적인 목록TsgLinkedList<T> 일반 양방향 링크리스트TsgForwardList<T> 일반 단방향 연결된 목록TsgHashMap<Key, T> 제네릭 unordered 사전TsgMap<Key, T> 2-3 트리를 기반으로 한 일반 순서 사전TsgSet<Key> 2-3 트리를 기반으로 한 제네릭 세트TsgPointerArray Unttttttttyty pointers 목록TsgPointerList 포인터에 의해 액세스 된 값의 유형 목록TCustomLinkedList 비 유형의 양방향 링크리스트TsgCustomTree 2-3 나무를 기반으로 한 유형의 사전 우리는 델파이 반복자를 추가하기 시작했습니다. 이제 for p in List do; 가장 흥미로운 점은 레코드를 사용하여 반복자를 구현하고 작동한다는 것입니다! 객체 사용과 비교할 때 생성 된 코드는 훨씬 효율적이며 힙에 대한 호출이 좋지 않으며 반복자의 변수는 스택에 있습니다. 이것은 나에게 꽤 즐거운 놀라움으로 판명되었습니다!
메모리 할당자를 지정하는 기능은 또한 우리가 주로 레코드를 사용한다는 것을 의미합니다. 일반적으로 일부 구조는 하나 이상의 메모리 영역을 사용하는데, 이는 간단한 메모리 관리자입니다. 구조를 사용한 후에는 메모리 영역을 제거하여 점유 한 모든 메모리를 반환 할 수 있습니다. 상속을 사용하여 제한 사항이 있습니다. 경우에 따라 상속을 집계 및 도우미로 대체 할 수 있습니다. 일반적으로 컬렉션을 구현하기 위해서는 문제가되지 않습니다. 레코드를 사용하면 컬렉션을 쌓을 수 있습니다. 이것은 때때로 매우 편리합니다.
객체 풀을 사용하면 객체를 만드는 것이 메모리 집중적이거나 특정 유형의 제한된 수의 객체를 만들 수있을 때 구조 재사용을 관리 할 수 있습니다.
우리가 무언가 사용을 중단하면 구조 나 물체를 삭제하는 것이 항상 가치가있는 것은 아닙니다. 종종 물체가 재창조되어야합니다.