나는 야생 추측을 할 것이다 :
C ++ 생성자와 소멸자는 전혀 함수가 아닙니다 : 매크로입니다. 객체가 생성 된 범위와 객체가 파괴 된 범위에 인라인됩니다. 결과적으로 생성 자나 소멸자가 없으며 객체는 IS입니다.
실제로 클래스의 다른 함수는 함수가 아니라 DONT가 인라인 함수 인 주소 함수를 사용하기 때문에 인라인 함수라고 생각합니다. 함수를 최적화하지 않으면 함수는 주소를 가져 가지 않은 경우에도 "아직있을 것"인 것처럼 보입니다.
C ++ "객체"의 가상 테이블은 JavaScript 객체와는 다릅니다. JavaScript 객체는 생성자를 가져와 런타임시 객체를 통해 객체를 생성 할 수 new XMLHttpRequest.constructor있지만이 객체와의 인터페이스 수단으로 사용되는 익명 함수에 대한 포인터 모음입니다. , 객체 생성 기능 제외. 그리고 객체를 "삭제"하는 것은 의미가 없습니다. 구조체를 삭제하려고하는 것과 같기 때문에 할 수 없습니다. 스택 레이블 일뿐입니다. 다른 레이블에서 원하는대로 쓸 수 있습니다. 클래스를 4 개의 정수로 사용하십시오.
/* i imagine this string gets compiled into a struct, one of which's members happens to be a const char * which is initialized to exactly your string: no function calls are made during construction. */
std::string a = "hello, world";
int *myInt = (int *)(*((void **)&a));
myInt[0] = 3;
myInt[1] = 9;
myInt[2] = 20;
myInt[3] = 300;
메모리 누수가 없으며 문제가 없습니다. 객체 인터페이스와 문자열을 위해 예약 된 많은 스택 공간을 효과적으로 낭비하지만 프로그램을 사용하지 않는 한 프로그램을 파괴하지는 않습니다. 다시 문자열로).
실제로, 이전의 가정이 맞다면 : 문자열의 전체 비용은 32 바이트와 상수 문자열 공간을 저장하는 비용입니다. 함수는 컴파일 타임에만 사용되며 인라인되고 던져 질 수 있습니다. 객체가 생성되고 사용됩니다 (구조체로 작업하고 함수 호출없이 직접 참조하는 경우 함수 점프 대신 중복 호출이 있는지 확인하지만 일반적으로 더 빠르며 공간을 덜 사용합니다). 본질적으로 함수를 호출 할 때마다 언어 디자이너가 설정 한 예외를 제외하고 컴파일러는 해당 호출을 문자로 수행하라는 명령으로 대체합니다.
요약 : C ++ 객체는 무엇인지 모릅니다. 인터페이스와의 인터페이스를위한 모든 도구는 정적으로 인라인되어 런타임시 손실됩니다. 이를 통해 데이터로 구조체를 채우는 것만 큼 효율적으로 클래스를 사용하고 함수를 전혀 호출하지 않고 해당 데이터로 직접 작업 할 수 있습니다 (이 함수는 인라인 됨).
이것은 컴파일러가이 정보를 버릴 수 없으므로 런타임 오버 헤드, 메모리 관리, 구조 호출 비용으로 유형 정보를 동적으로 유지하는 javascript뿐만 아니라 COM / ObjectiveC의 접근 방식과는 완전히 다릅니다. 동적 디스패치 결과적으로 런타임에 프로그램과 "토크 (Talk)"할 수 있으며, 실행 가능한 동안 반영 가능한 구성 요소를 사용하여 프로그램을 개발할 수 있습니다.