class classWithNoVirtualFunction
{
public:
int a;
void x()
{
char c;
c = 'a';
}
};
class classWithOneVirtualFunction
{
public:
int a;
virtual void x() {}
};
class classWithTwoVirtualFunctions
{
public:
int a;
virtual void x() {}
virtual void y() {}
};
int main()
{
cout << "\nclassWithNoVirtualFunction's size: " << sizeof (classWithNoVirtualFunction);
cout << "\nclassWithOneVirtualFunction's size: " << sizeof (classWithOneVirtualFunction);
cout << "\nclassWithTwoVirtualFunctions's size: " << sizeof (classWithTwoVirtualFunctions);
cout << "\nvoid*'s size : " << sizeof (void*);
}
위의 코드, C의 생각은 ++ 말한다 W.R.T :가상 함수 만 포함 된 클래스의 크기가 영향을받는 이유는 무엇입니까?
적어도 하나의 데이터 멤버 필요한이 예. 데이터 멤버가 없으면 C++ 컴파일러는 각 개체가 고유 한 주소를 가져야하므로 크기가 아닌 개체를 강제로 적용하게됩니다. 크기가 0 인 객체 배열에 대한 인덱싱을 생각하면 을 이해할 수 있습니다. "더미"멤버는 이 0 인 객체에 삽입됩니다.
내 질문 : 지금, 나는 을 이해 할 수없는 나는 우리가 제로 회원들과 가상 함수와 클래스가있는 경우이 발생하는 방법을 정확하게 & &. 몇 가지 프로그래밍 예제로 설명하십시오.
내가 어떻게 프로그래밍 예제를 설명 할 수 있을지 모르겠다 * 당신이 이미 추가 한 것 이상 ('int'을 제거한 것). BTW, 프로그램의 예상 출력은 (1, x, x, x)입니다. 여기서 x는 아키텍처의 포인터 크기 (일반적으로 32/64 비트 아키텍처의 경우 4/8)입니다. –
@ DavidRodríguez-dribeas 엄밀히 말하면, 첫 번째 출력은 1이 아니고 단지 0이 아니라는 요구 사항은 없습니다. Unisys 메인 프레임이라는 워드 어드레싱 머신에서, 나는 단어의 크기가 될 것으로 기대합니다. 값은 동일해야합니다. 엄밀히 말하면 나머지 값도 동일해야한다는 요구 사항이 없습니다. 나는'void *'가'vptr'에 필요한 것보다 큰 하드웨어에서 일했습니다. (하지만 C++ 시대 이전에는 그런 짐승이 아직 없다고 생각합니다.) –