공부/C++ Quiz

geeksforgeeks Output of C++ Program | Set 1

sudo 2021. 7. 7. 19:26

Predict the output of below C++ programs.

Question 1

// Assume that integers take 4 bytes.
#include<iostream>
  
using namespace std;   
  
class Test
{
  static int i;
  int j;
};
  
int Test::i;
  
int main()
{
    cout << sizeof(Test);
    return 0;
}

Answer: 4

 

우선 클래스(혹은 구조체)객체 선언시 static 변수는 객체 사이즈에 포함되지 않는다. 우선 멤버 변수로 static 변수가 선언되면 객체마다 메모리가 할당되는게 아니라 프로그램 시작시 그 클래스의 객체들끼리 공유하는 하나의 메모리만 할당한다. 따라서 특정 객체에 속하는 것이 아니므로 클래스나 구조체 사이즈에 포함되지 않는다.

 

또한 다음과 같이 클래스 선언을 하면 뭐가 출력될까

class Test
{
static int i;
int j;
int* k;

Test() { k = new int[100]; }
};

int main()
{
	cout << sizeof(Test);
	return 0;
}

 

Answer: 8

 

아무리 생성자에서 동적할당을 했다 하더라도, 컴파일 타임에는 int j와  int* k만 잡히고 동적 할당된건 프로그램이 시작하면 할당되므로 int의 size + int*의 size = 8byte가 나온다.

 

static 멤버 함수와 non-static 멤버 함수를 선언하면 클래스의 사이즈는 어떻게 될까. 결론부터 이야기하면 static 멤버 함수든, non-static 멤버 함수든 객체의 크기에 영향을 미치지 않는다. 왜냐하면 함수의 동작이 같은 클래스의 객체면 동작하는게 모두 같기 때문에 객체마다 할당하는게 아니라, code영역에 저장해놓고 모두 공유한다. 

 

참고로 static 멤버 함수의 특징에 3가지가 있다.

1. 특정 객체에 바인딩되는게 아니므로 static 멤버 함수는 non-static 멤버 변수에 접근할 수 없다.

2. 객체를 통해서 뿐만 아니라 클래스명으로도 사용할 수 있다.

3. 특정 객체에 바인딩되는게 아니므로 this 포인터를 사용할 수 없다.

 

 

 

Reference

https://www.geeksforgeeks.org/output-of-c-program-set-1/

 

Output of C++ Program | Set 1 - GeeksforGeeks

A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.

www.geeksforgeeks.org

http://tcpschool.com/cpp/cpp_encapsulation_staticConst

 

코딩교육 티씨피스쿨

4차산업혁명, 코딩교육, 소프트웨어교육, 코딩기초, SW코딩, 기초코딩부터 자바 파이썬 등

tcpschool.com