공통 [10.4 시드니 신기능 Deep Dive] 델파이 추가된 문법 및 변경 사항
2020.06.05 13:38
RAD Studio 10.4에서 변경 된 문법들을 정리 해 보았습니다.
통합 메모리 관리
델파이 메모리 관리는 이제 개체 메모리 관리의 고전적인 구현을 사용하여 지원되는 모든 플랫폼 (모바일, 데스크탑 및 서버)에 통합되었습니다.기존의 ARC(Automatic Reference Counting) 메모리 관리 기능은 훌륭하지만 항상 기존의 메모리 관리 방식을 사용하는 데스크탑 컴파일러와 호환되지 않았으며 메모리 소유주 모델 또는 TComponent 및 파생 클래스를 기반으로 하는 라이브러리와 일치하지 않았습니다. 통합 메모리관리로 인해 델파이 메모리 관리가 모든 버전에서 통합되어 기존 코드와의 호환성이 향상되고 컴포넌트, 라이브러리 및 사용자 애플리케이션의 코딩이 단순화 해집니다. 결과적으로 델파이 데스크탑 코드가 이제 모바일 플랫폼과 더 잘 호환된다는 것을 의미합니다. ARC 모델은 모든 플랫폼에서 문자열 관리 및 인터페이스 유형 참조를 위해 유지됩니다.
C ++ 영향 : 메모리 관리
new/delete를 통해 모든 오브젝트를 생성하고 해제 합니다. 델파이 스타일 클래스 (델파이로 구현 된 클래스 또는 C++로 구현 된 델파이 클래스의 자손의 일반적인 생성 및 삭제는 힙에 할당 된 일반 C++ 클래스와 마찬가지로 일반적인 메모리 관리를 따릅니다
C ++의 델파이 스타일 클래스에서는 스택 할당이 지원되지 않았습니다. 마찬가지로 make_unique <>를 사용할 수 없습니다
모바일 플랫폼에서 NextGen 제한 사항 제거
델파이 모바일 컴파일러는 NextGen 플래그 및 관련 언어 제한을 비활성화합니다. 이제 모바일 플랫폼에서 Char 및 AnsiString과 같은 타입을 사용할 수 있다는 것을 의미합니다. 그러나 ANSI 및 코드 페이지와 같은 일부 윈도우 개념은 실제로 모바일에 존재하지 않으므로 Numeric 캐릭터 값이 플랫폼 간에 동일하게 매핑되지는 않습니다. 물론 이것은 유니 코드 문자열 (델파이의 기본 문자열 유형은 UTF-16를 기반으로 합니다.)에는 해당하지만 1 바이트 문자열에는 해당되지 않습니다.
이러한 변경 사항에 따라 모든 플랫폼에서 {$ ZEROBASEDSTRINGS OFF}를 사용하여 []를 통해 문자열 요소 액세스에 대한 기본값을 수정했습니다. 0 로부터 시작하는 문자열 액세스 모드를 사용하지 않도록 설정했음에도 불구하고 이는 []에만 해당되며, TStringHelper 메서드는 항상 그랬듯이 0부터 시작하는 문자열 위치 카운팅을 사용하는 동일한 모델을 계속 사용합니다.
문자열
인덱싱은 다음과 같습니다.
● 델파이 문자열 타입 헬퍼 : 0 기반
● 델파이 플랫 함수들 : 1 기반
● C ++ : 항상 1 기반입니다. 플랫폼, 데스크탑 또는 모바일과 관계 없이 모든 C ++ 구현 코드 (AnsiString 및 UnicodeString 포함)는 1 기반입니다. 인덱싱은 여전히 델파이 헬퍼와 일치하지 않지만 C ++로만 작업하는 C++ 개발자의 경우 C ++에서 동작이 1 기반으로 일관됩니다.
커스텀 매니지드 레코드(Custom Managed Record)
델파이 언어에 추가된 주요 문법으로, 델파이 레코드 타입은 이제 초기화(Initialization), 종료(finalization), 그리고 복사 연산자를 직접 작성할 수 있습니다. 개발자들은 레코드 생성, 복사, 파괴하는 각 단계에서 실행될 코드를 직접 작성해 지정할 수 있습니다. 이 추가기능을 잘 활용한다면 클래스보다 더 효과적으로 사용할 수도 있습니다.
- 커스텀 매지지드 레코드 자세히 보기 : https://tech.devgear.co.kr/463262
- 커스텀 매니지드 레코드 핵심 요약 비디오 보기 (한국어 음성, 46초): https://www.youtube.com/watch?v=BTnOlAypdaE&list=PLpSzuJvn7BTzKdvtB1-6Q79XZL1vF2NQF&index=2
비트 카운팅 표준 기능
아래에 나열된 일반적인 저수준(Low Level) 비트 처리 작업을 위한 새로운 표준 기능이 도입되었습니다.
- 선행 제로 수 카운트
매개 변수 X의 최상위 1 비트 앞에 있는 선행 0 비트 수를 계산합니다. X가 0이면 비트 너비를 리턴합니다. 즉 CountLeadingZeros32의 경우 32, CountLeadingZeros64의 경우 64입니다.
function CountLeadingZeros32(X: Cardinal): Integer;
function CountLeadingZeros64(X: UInt64): Integer;
- 후행 제로 수 카운트
매개 변수 X의 최하위 1 비트 다음에 오는 후행 0 비트 수를 계산합니다. X가 0이면 비트 너비를 리턴합니다.
즉, CountTrailingZeros32의 경우 32, CountTrailingZeros64의 경우 64입니다.
function CountTrailingZeros32(X: Cardinal): Integer;
function CountTrailingZeros64(X: UInt64): Integer
- 파라미터 개수 카운팅
파라미터 X의 1의 개수를 계산합니다. 반환 값의 범위는 0 ~ 비트 폭 너비 사이입니다.
즉 CountPopulation32의 경우 32, CountPopulation64의 경우 64입니다.
function CountPopulation32(X: Cardinal): Integer;
function CountPopulation64(X: UInt64): Integer;