전체 글
-
static 변수 특징쥬신게임아카데미/C++ 2016. 1. 6. 16:16
초기값을 주지 않을 경우 항상 0으로 초기화되고 프로그램을 실행시킬 때 단 한번만 초기화 된다.(초기값이 있든지 없든지 상관없고..없으면 0으로 한번만..) 아래의 상황을 고려해서 사용여부 결정 1. 클래스 설계시 멤버 변수 중에 모든 인스턴스에서 공통으로 사용해야 하고 상태 값이 변경되지 않는 경우에는 static 변수 사용 2. 클래스 설계시 메소드 중 내부의 인스턴스 변수를 사용하지 않는 것은 static메소드 사용 C/C++ C 프로그래밍 언어는 static, auto, register, extern 4개의 storage class - 여기에서 객체의 클래스가 아닌 집합의 의미를 가진다 - 를 가진다. static global variable 소스파일의 최상의 레벨에서 함수외부에 선언되는 stat..
-
함수 반환값 const / 멤버함수 const쥬신게임아카데미/C++ 2016. 1. 6. 15:35
주제 : 멤버함수의 반환값은 Const로 하여라. 안녕하세요~ : ) Crc12입니다. 이번주제는 멤버함수의 반환값을 Const로 하는 이유에 대해서 설명을 하려고 합니다. 아래에나오는 함수는 문자열을 이용하는 함수인데요 그 함수의 반환값에 대해서 설명하려고합니다. 우선 아래의 코드에 주목해 주세요. ( 적당한 소스가 될지는 모르겠습니다... ) 우선 아래에서 CMky라는 클래스를 선언하였습니다. class CMky { // Member Variable private: char *m_szString; // Operator public: const char *GetString(); // Member Function public: CMky() { m_szString = NULL , m_szString = n..
-
인라인 함수 언제사용하지??@ 16. 1 ~ 17. 1/Effective C++ 2015. 12. 31. 23:09
인라인 함수 함수호출비용이 면제 인라인을 남발하면 안됨..인라인 함수로 인해 부풀려진 코드는 성능의 걸림돌이 되지 쉽다. 명령어 캐시 적중률이 떨어질 가능성도 높다.. 하지만 함수의 본문이 매우짧다면 인라인 사용하면 효율이 훨씬더 좋다,, 인라인은 명시적으로 함수 앞에 inline을 붙이면 된다. inline void f() { } 이런식으로.. 그리고 대체적으로 헤더파일에 들어 있어야 하는게 맞다..이유는 대부분의 빌드 환경에서 인라인을 컴파일 도중에 수행하기 때문이다. 그런데 이것은 요청이지 명령이 아니다..즉, 컴파일러가 자신이 보기에 복잡한 함수는 절대로 인라인 확장의 대상에 넣지 않는다.(루프가 들어있다거나 재귀함수인 경우가 이런예다) 그리고 가상 함수 호출 같은것은 절대로 인라인 해주지 않는다..
-
메모리값 관련.의미..쥬신게임아카데미/궁금했던것 2015. 12. 29. 17:46
메모리값 의미 0xCDCDCDCD 힙에 할당된 메모리다.그러나 초기화 되지 않았다. 0xDDDDDDDD 힙에서 Free된 메모리이다. 0xFDFDFDFD "NoMansLand?"(아무도 여기에 있어서는 안된다. 즉 자동적으로 할당된 힙 메모리 바운더리에 놓여지는 값이다. 결고 overwrite되선 안되고, 만약 이 값이 변경되면 할당된 영역이상 쓰여진 것이다. 이럴 경우 VC에서 경고를 내준다. 0xCCCCCCCC 스택에 할당된 메모리이다. 그러나 초기화 되지 않았다. http://www.hackerschool.org/Sub_Html/HS_University/BOF/essential/PDF_Files/15.pdf
-
메모리 구조관련(미해결..)쥬신게임아카데미/궁금했던것 2015. 12. 29. 16:46
보통 Heap의 경우는 하위 주소에서 상위 주소쪽으로 변수가 채워지며, Stack의 경우는 상위 주소에서 하위 주소쪽으로 변수가 채워진다. 이는 프로그램 도중 Stack이 얼마나 필요할지 알 수 없으므로 Stack은 거꾸로 채워나간다 상위 메모리 주소 0xffff 하위 메모리 주소 0x0000 stack의 지역변수는 사용하고 소멸하므로 데이터 용량의 불확실성을 가지므로 밑에서부터 채워 올리고 heap은 위에서 부터 채워 내려진다. 용량의 불확실성은 컴파일러가 알아서 메모리영역을 선택(랜덤적) -stack영역에서의 주소값은 시작주소는 밑에서부터(먼저선언된 순서) 그다음 주소는 순서대로 정해진다. HEAP overflow-heap이 위에서부터 주소값을 채워져 내려오다가 stack영역을 침범하는 경우. STA..
-
소멸자에서 예외를 발생?@ 16. 1 ~ 17. 1/Effective C++ 2015. 12. 5. 16:06
소멸자에서 예외를 발생시킬 수 있는 클래스가 있다. 이게 무슨 상황이냐면.. 아래와 같은 클래스가 하나있다.. class DBConnection { public: static DBConnection create(); //DBConnection 객체를 반환하는 함수. void close(); //연결을 닫습니다, 이떄 실패하면 예외를 던짐 }; 보면 사용자가 DBConnetion 객체에 대해 close를 직접 호출해야하는 설계이다.(close는 종료를 뜻하지) 사용자의 망각을 사전에 차단하는 좋은 방법이라면 DBConnection에 대한 자원 관리 클래스를 만들어서 그 클래스의 소멸자에서 close를 호출하게 하면 된다! 아래 처럼! class DBConn //DBConnection 객체를 관리하는 클래스..
-
기본 대입연산자 생성조건?@ 16. 1 ~ 17. 1/Effective C++ 2015. 12. 4. 21:37
class Test { public: Test(int& _num, int& _num2) : num(_num), num2(_num2) { } private: int& num; //이것들 떄문에.. const int num2; //이것들 때문에 }; void main() { int num = 10; int num2 = 100; int num3 = 5; int num4 = 50; Test a(num, num2); Test b(num3, num4); a = b; //대입시 에러발생 } 파란색 글씨처럼 클래스내 참조나, 상수 멤버가 있다면 이걸 바탕으로 디폴트 대입연산자(기본 대입연산자) 실행되버리면 컴파일 에러가 난다. 원래 저것들(파란색)은 대입이라는 개념이 없는 것들이니까.. 이럴때는 디폴트 말고 사용자가 ..
-
클래스 생성자는 초기화가 아니다. 정적(static)객체의 종류와 방법@ 16. 1 ~ 17. 1/Effective C++ 2015. 12. 4. 21:25
생성자내에서 하는 행동들 생성자 { ~~~~~~~~~~~ } ~~ 부분에서 이뤄지는것들은 초기화가 아니라 대입이다. 초기화는 생성자중에서도 멤버 초기화 리스트를 통해서만 이뤄진다. 즉, 초기화하려면 멤버 초기화 리스트를 이용해라 책에서는 이렇게 강조한다. 무조건 기본 디폴트 생성자라고 해도 클래스내 멤버는 초기화 리스트로 초기화해라.. 생성자:생성자() : 초기화 리스트 {} 이렇게.. 정적 객체(static)는 자신이 생성된 시점부터 프로그램이 끝날 때까지 살아 있는 객체 (애초에 스택객체, 힙 기반 객체는 될 수가 없다.) 정적 객체도 비지역 정적 객체(4가지 경우)와 (1 전역객체, 2 네임스페이스 유효범위에서 정의된 객체, 3 클래스 안에서 static으로 선언된 객체, 4 파일 유효범위에서 st..