저는 Delphi를 처음 접했고 기본적으로 어떤 개체 변수와 스택 변수가 초기화되는지 확인하기 위해 몇 가지 테스트를 실행했습니다.
TInstanceVariables = class
fBoolean: boolean; // always starts off as false
fInteger: integer; // always starts off as zero
fObject: TObject; // always starts off as nil
end;
이것은 내가 다른 언어에서 익숙한 행동이지만 Delphi에서 의존하는 것이 안전한지 궁금합니다. 예를 들어 컴파일러 설정에 따라 달라지는 지 아니면 다른 컴퓨터에서 다르게 작동하는지 궁금합니다. 객체의 기본 초기화 값에 의존하는 것이 정상입니까, 아니면 생성자에서 모든 인스턴스 변수를 명시 적으로 설정합니까?
스택 (프로 시저 수준) 변수의 경우, 내 테스트에서 단위 화 된 부울이 참이고 단위 화 된 정수가 2129993264이며 초기화되지 않은 객체는 잘못된 포인터 (즉 nil이 아님)임을 보여줍니다. 나는 그것들에 접근하기 전에 항상 프로 시저 수준의 변수를 설정하는 것이 규범이라고 생각한다.
답변
예, 이것은 문서화 된 동작입니다.
-
개체 필드는 항상 0, 0.0, ”, False, nil 또는 적용되는 항목으로 초기화됩니다.
-
전역 변수는 항상 0 등으로 초기화됩니다.
-
로컬 참조 카운트 * 변수는 항상 nil 또는 ”로 초기화됩니다.
-
참조 횟수가 계산되지 않은 지역 * 변수는 초기화되지 않으므로 사용하기 전에 값을 할당해야합니다.
나는 기억 배리 켈리 곳은 “참조 – 계산”에 대한 정의를 썼다, 그러나 이것은 그 동안 무엇을해야하므로, 더 이상 그것을 찾을 수 없습니다 :
reference-counted == 자체적으로 참조 계산되거나 직접 또는 간접적으로 필드 (레코드의 경우) 또는 참조 계산되는 요소 (배열의 경우)를 포함합니다.
string, variant, interface
또는 동적 배열 또는 이러한 유형을 포함하는 정적 배열 .
노트:
record
그 자체로는 참조 계산에 충분하지 않습니다.- 나는 아직 제네릭으로 이것을 시도하지 않았습니다.
답변
명시 적 이니셜 라이저가없는 전역 변수는 실행 파일의 BSS 섹션에 할당됩니다. 그들은 실제로 EXE에서 어떤 공간도 차지하지 않습니다. BSS 섹션은 OS가 할당하고 0으로 지우는 특수 섹션입니다. 다른 운영 체제에도 유사한 메커니즘이 있습니다.
0으로 초기화되는 전역 변수에 의존 할 수 있습니다.
답변
클래스 필드는 기본적으로 0입니다. 이것은 신뢰할 수 있도록 문서화되어 있습니다. 로컬 스택 변수는 문자열 또는 인터페이스가 아니면 정의되지 않으며 0으로 설정됩니다.
답변
참고로 (Delphi를 처음 사용하는 것처럼) 전역 변수를 선언 할 때 직접 초기화 할 수 있습니다.
var myGlobal:integer=99;
답변
다음은 Ray Lischners Delphi가 요약 한 2 장 에서 인용 한 것입니다.
“Delphi가 객체를 처음 생성 할 때 모든 필드가 비어있는 상태로 시작합니다. 즉, 포인터가 nil로 초기화되고, 문자열과 동적 배열이 비어 있고, 숫자 값이 0이고, 부울 필드가 False이고, Variants가 할당되지 않음으로 설정됩니다. (자세한 내용은 5 장의 NewInstance 및 InitInstance를 참조하십시오.) “
범위 내 변수를 초기화해야한다는 것은 사실입니다. 위의 “글로벌 변수가 초기화되었습니다”라는 주석은 참조가 제공 될 때까지 모호한 것으로 취급 할 것입니다. 믿지 않습니다.
편집 … Barry Kelly는 그것들이 0으로 초기화되는 것에 의존 할 수 있다고 말합니다. 그리고 그가 Delphi 컴파일러 팀에 있기 때문에 나는 그것이 의미한다고 믿습니다. 🙂 Barry 감사합니다.
답변
전역 변수 및 개체 인스턴스 데이터 (필드)는 항상 0으로 초기화됩니다. 프로 시저 및 메서드의 로컬 변수는 Win32 Delphi에서 초기화되지 않습니다. 코드에서 값을 할당 할 때까지 해당 내용은 정의되지 않습니다.
답변
언어가 기본 초기화를 제공하더라도 이에 의존해야한다고 생각하지 않습니다. 값으로 초기화하면 언어의 기본 초기화에 대해 알지 못하는 다른 개발자에게 훨씬 더 명확 해지고 컴파일러 간의 문제를 방지 할 수 있습니다.