본문 바로가기

공부36

[3장] 함수 호출 규약 C++ 함수 호출 규약 (calling conventions)은 함수 호출 시 함수 인자와 반환값을 처리하는 방식을 정의하는 규칙입니다. 호출 규약은 컴파일러와 링커가 일관되게 함수 호출을 처리하도록 합니다. 다음은 주요 호출 규약의 종류, 설명, 차이점, 예제 코드, 그리고 간단한 어셈블리 코드 예제입니다.1. cdecl (C Declaration)설명: 기본 C 호출 규약으로, 인자는 오른쪽에서 왼쪽으로 스택에 푸시됩니다. 함수 호출자가 스택을 정리합니다.장점:유연성: 가변 인수 함수에서 사용 가능.호출 규약의 일관성: C와 C++에서 많이 사용되어 표준화됨.디버깅 편리성: 호출자가 스택을 정리해 디버깅이 쉬움.int __cdecl add(int a, int b) { return a + b;}p.. 2013. 6. 11.
CUDA ("Compute Unified Device Architecture", 쿠다) CUDA ("Compute Unified Device Architecture", 쿠다)는 그래픽 처리 장치(GPU)에서 수행하는 (병렬 처리) 알고리즘을 C 프로그래밍 언어를 비롯한 산업 표준 언어를 사용하여 작성할 수 있도록 하는 GPGPU 기술이다. CUDA는 엔비디아가 개발해오고 있으며 이 아키텍처를 사용하려면 엔비디아 GPU와 특별한 스트림 처리 드라이버가 필요하다. CUDA는 G8X GPU로 구성된 지포스 8 시리즈급 이상에서 동작한다. 엔비디아는 지포스 8 시리즈 상에 작성된 프로그램은 앞으로 개발될 엔비디아 비디오 카드에서도 별도의 프로그램 수정 없이 작동할 것이라고 선언했다. CUDA는 CUDA GPU 안의 명령셋과 대용량 병렬 처리 메모리를 접근할 수 있도록 해 준다. 개발자는 패스스케일.. 2010. 3. 8.
항목 38 ] “has – a(…는 …를 가짐)” 혹은 is – implemented-in-terms-of(…는 …를 써서 구현됨)”를 모형화할 때는 객체 합성을 사용하자 모형화할 때는 객체 합성을 사용하자 합성(composition)이란, 어떤 타입의 객체들이 그와 다른 타입의 객체들을 포함하고 있을 경우에 성립하는 그 타입들 사이의 관계를 일컫습니다. 포함된 객체들을 모아서 이들을 포함한 다른 객체를 합성한다는 뜻인데, 다음과 같은 경우입니다. 문제점 1 2 3 4 5 6 7 8 9 10 11 12 13 class Address { …. }; // 누군가의 거주지 class PhoneNumber { …. }; class Person { public: private: std::string mane; // 이 클래스를 이루는 객체 중 하나 Address address; // 마찬가지 PhoneNumber voiceNumber; // 역시 마찬가지 PhoneNumber fa.. 2010. 3. 8.
항목 37 ] 어떤 함수에 대해서도 상속받은 기본 매개변수 값은 절대로 재 정의하지말자 상속받은 기본 매개변수 값은 절대로 재 정의하지 말자 C++에서 상속받을 수 있는 함수: 가상, 비가상 함수 상속되는 함수는 동적으로 바인딩 된다., 기본 매개변수는 정적 바인딩된다. 가상 함수는 동적으로 바인딩되지만, 런타임 효율성 때문에 기본 매개변수 값은 정적으로 바인딩된다. 동적 바인딩은 늦은 바인딩(late binding)이라고도 불리는데, 객체가 실행 시 그 순간의 상태에 따라 일어난다. 프로그래밍에서 변수들은 정수나 문자열 등 형태에 따라 그 변수에 저장되는 값의 저장방법이나 조작방법이 달라진다. 전통적인 컴파일러들이나 어셈블러들은 컴파일 시점에 변수의 형식을 할당하는 정적 바인딩을 제공하였으나, 객체지향 언어들은 실행 시 키보드 또는 기타 다른 소스로부터 값이 변수에 들어오는 그 순간에 변.. 2010. 3. 8.
항목 36 ] 상속받은 비 가상함수는 재정의하면 안된다 상속받은 비 가상 함수는 재정의하면 안 된다 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 #include class A { public: void f() { std::cout 총평 public 상속은 is-a 관계입니다. 그리고 비가상 함수는 클래스 파생에 관계없는 불변 동작을 정해주는 것입니다. 즉 불변의 동작을 원하여 만든 함수를 파생 클래스에서 다시 정의하면 이것이 목적이 있어 다시 정의하는 것이라면 결국 비 가상 함수를 쓸 이유가 전혀 없다는 것입니다. 결국. 목적이 있어 다시 정의하는 함수 일 경우에는 가상함수를 쓰는 것 이 좋습니다. 결국에는 비 가상 함수는.. 2010. 3. 8.
항목 35 ] 가상 함수 대신 쓸 것들도 생각해 두는 자세를 시시때때로 길러 두자. 가상 함수 대신 쓸 것들도 생각해 두는 자세를 시시때때로 길러 두자. 1) 비가상 인터페이스 관용구(non-virtual interface)를 사용하자. - 공개되지 않은 가상 함수를 비가상 public 멤버 함수로 감싸서 호출하는, 템플릿 메서드 패턴의 한 형태 - NVI에서 가상 함수가 엄격하게 public 일 필요는 없다. - 장점 : 가상 함수가 호출되기 전에 어떤 상태를 구성하고 가상 함수가 호출된 후에 그 상태를 없애는 작업을 래퍼를 통해 공간적으로 보장된다. *비가상 인터페이스 관용구(non-virtual interface)란? - 사용자로 하여금 public 비가상 멤버 함수를 통해 private 가상 함수를 간접적으로 호출하게 만드는 방법. - 관용구에 쓰이는 비가상 함수는 가상함수의 래.. 2010. 3. 8.
항목 34 ] 인터페이스 상속과 구현 상속의 차이를 제대로 파악하고 구별하자. 인터페이스 상속과 구현 상속의 차이를 제대로 파악하고 구별하자. 인터페이스 상속과 구현 상속은 무엇을 의미하는가? 기본 클래스의 멤버 함수의 상속 방법을 두고 하는 말이다. 인터페이스 상속과 구현 상속의 차이점은 무엇인가? 인터페이스 상속이란, 순수 가상 함수의 상속을 말한다. 구현 상속이란, 가상 함수와 비가상 함수의 상속을 말한다. 각 함수들은? 순수 가상 함수 : 가상 함수이나, 함수의 정의 부분이 없고, 선언 부분만 있는 함수 가상 함수 : 파생 클래스에서 가상 함수를 받는 함수가 없다면, 기본 클래스 함수가 호출되고 있다면, 파생 클래스의 가상 함수를 호출시켜주는 매체가 되는 함수 비 가상 함수 : 일반 멤버 함수, 예제 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17.. 2010. 3. 8.
항목 33 ] 상속된 이름을 숨기는 일은 피하자. 상속된 이름을 숨기는 일은 피하자. 파생 클래스의 이름은 기본 클래스의 이름을 가린다. Scope (유효 범위) 1 2 3 4 5 6 int x; // 전역 변수 void someFunc() { double x; // 지역 변수 std::cin >> x; // 입력을 받아, 지역 변수 x에 새 값을 읽어 넣음 } Colored by Color Scripter cs *안쪽 유효 범위에 있는 이름이 바깥쪽 유효범위에 있는 이름을 가림 상속 부모 클래스에 속해 있는 것을 자식 클래스 멤버 함수 안에서 참조하는 문장이 있으면 컴파일러는 참조 대상을 바로 찾아낼 수 있음 자식 클래스의 유효 범위가 부모 클래스의 유효 범위 안에 중첩되어있음 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17.. 2010. 3. 8.
항목 32 ] public 상속 모형은 반드시 "is-a(...는 ...의 일종이다)"를 따르도록 만들자. 상속 모형은 반드시 "is-a" • 클래스 D(Derived)를 클래스 B(Base)로부터 public 상속을 통해 파생시켰다 • D 타입으로 만들어진 모든 객체는 또한 B 타입의 객체이지만, 그 반대는 되지 않음 • B 타입의 객체가 쓰일 수 있는 곳에는 D 타입의 객체도 마찬가지로 쓰일 수 있다고 단정 • D 타입이 필요한 부분에 B 타입의 객체를 쓰는 것은 불가능 • 모든 D는 B의 일종이지만, B는 D의 일종이 아님 • C++는 public 상속을 이렇게 해석하도록 문법적으로 지원 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 class Person {...}; class Student: public Person {...}; // 모든 학생은 사람이지만 모든.. 2010. 3. 8.
항목 31 ] 파일 사이의 컴파일 의존성을 최대로 줄이자. 파일 사이의 컴파일 의존성을 최대로 줄이자. 클래스 하나만 추가해서 빌드를 했더니 건들지도 않은 부분도 컴파일되고 다시 링크된다. C++가 인터페이스와 구현을 깔끔하게 분리하지 못하기 때문입니다. C++의 클래스 정의는 클래스 인터페이스만 지정하는 것이 아니라 구현 세부사항까지 지정하고 있습니다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 class Person { public: Person(const std::string&name, const Date& birthday, const Address& addr); std::string name() const; std::string birthDate() const; std::string address() const; private:.. 2010. 3. 8.
항목 30 ] 인라인 함수는 미주알고주알 따져서 이해해 두자 인라인 함수는 미주알고주알 따져서 이해해 두자 인라인 함수의 정의 함수 호출 문을 그 함수의 본문으로 바꿔치기하는 함수. 컴파일러에 대한 개발자의 요청으로 무시될 수도 있다. inline 함수 1 2 3 4 5 6 7 8 9 10 11 12 13 inline void foo() { cout 잘못된 인라인은 예외 1 2 3 4 5 6 7 8 9 10 11 12 13 14 class Base { public: private: std::string bm1,bm2; }; class Derived : public Base { public: Derived() {} // 비어 있지만 컴파일러가 만들어 내는 코드가 있다. private: std::string bm1,bm2,bm3; }; Colored by Color .. 2010. 3. 8.
항목 29 ] 예외 안전성이 확보되는 그날 위해 싸우고 또 싸우자! 예외 안전성이 확보되는 그날 위해 싸우고 또 싸우자! 예외 안전성이란 무슨 말인가? "예외적 상황에 대해서 안전한가?"에 대한 말이다. 왜 확보해야 하는가? 코딩중에 컴파일타임에 에러를 다 찾아내면 좋겠지만, 컴파일 타임에 찾지 못하는 에러들은 정말 찾기가 힘들어진다. 그렇기 때문에, 예외적 상황에 대해서 대처를 해야지만 디버깅이 용이해지고, 프로그램 자체도 더 견고해지기 때문에 확보해야 한다. 함수들의 예외 안전성은 어떻게 동작해야 하는가? 1. 자원이 절대 새도록 만들지 않는다. 2. 자료구조가 더렵혀지는 것을 허용하지 않는다. 그렇다면, 예외 안전성을 갖춘 표준 보장은 무엇인가? 1. 기본적인 보장(basic guarantee) : 예외 발생에 있어, 자원 누수를 시키지 않겠다는 보장 2. 강력한 .. 2010. 3. 8.
반응형