“우리 대부분은 초라한 옷차림과 엉터리 가구들을 부끄럽게 여기지만, 초라한 생각과 엉터리 철학을 부끄럽게 여길 줄 알아야 한다.” – Albert Einstein

19800104
common

– 대기중에 가장 많은 원소는

질소

– 문자열 c함수 // 대응 cpp함수

변환

atof – 바이트 문자열 실수로 // stof

atoi – 바이트 문자열 정수로 // stoi

strtol // stol

strtoul // stoul

strtof // stof

조작

strcpy – 문자열 복사 // string은 새로 할당해서 복사, copy

strcat – 문자열 연결 // string +

검사

strlen – 길이 반환 // string size

strcmp – 문자열 비교 // string ==, compare

strchr – 해당 글자가 처음 나타나는 위치 반환 // string find

strspn – A, B 문자열을 비교해서 A에서 B에 없는 문자 위치 반환

strpbrk – 구분자가 있는지 확인

strstr – 해당 문자열이 시작되는 위치 반환

strtok – 구분자로 문자열을 분리해서 반환 // stringstream에 string을 넣고 getline해서 꺼냄

– stack과 heap차이

stack은 함수가 사용하는 지역변수나 parameter, return값같은 임시 memory의 크기를 compile 타임에 결정, 저장하는 영역이고

heap은 compile 타임에는 알 수 없는 동적인 크기의 memory를 런 타임에 크기를 결정, 저장하는 영역

이외에 global, static, array, struct는 데이터 영역이라는 공간에 할당된다

– struct의 크기를 sizeof로 구할시 주의 점

struct를 memory에 배치할 때 cpu의 cache 속도 향상을 위해 4바이트에 맞춰 배치하므로 4바이트 미만의 멤버는 padding이 생긴다

이때문에 빈공간도 함께 전체 크기에 합산되므로 실제 크기와 다르게 나오게 된다. 정확한 크기를 알아야 할 때 주의해야 한다.

– overload와 override의 차이

overload는 parameter만 다른 동일한 이름의 함수를 작성하는 것

override는 기존 부모 클래스의 함수에 덮어 씌우는(올라타는) 자식 클래스의 함수를 작성하는 것

– Overloading과 Overriding의 차이가 무엇인가?

오버로딩은 함수의 이름이 같고 인자의 형태가 다른 것.

오버라이딩은 파생클래스에서 함수의 이름, 반환형, 인자의 형태가 같고, 재정의하여 기존의 함수를 가리는 것.

– global과 static 변수의 차이

global 변수는 다른 파일에서 extern으로 참조가 가능 하지만 static 변수는 전역일 경우 파일에 지역일 경우 함수에 묶여서 그 범위내에서만 참조가 가능이러한 특성 때문에 static 지정된 변수는 다른 파일 간에 같은 이름 사용이 가능함. 그러니 이는 권장하지 않으며 같은 이름을 사용해야 하는 경우에는namespace를 사용

– 스태틱 변수 초기화 시점? ( 이거 정확치 않음 )

전역 일 경우 변수가 있는 파일이 불릴 때 초기화가 됨

지역일 경우는 해당 함수가 불린 뒤 최초 호출시에 동시에 초기화

– 다형성?

동일한 함수 호출에 대해 서로 다른 클래스에 맞춰 다른 동작을 할 수 있게 하는 것. 부모가 존재하고 이를 상속 받는 자식이 여럿 있는 경우 부모에서 정의한 함수를 자식이 각각 override하여 구현, 이후 자식의 타입 상관없이 해당 함수을 호출하면 그에 해당하는 동작 진행.

– 다형성이 무엇인가.

서로 다른 객체가 동일한 호출에 대하여 다르게 행동 할 수 있는것. 부모 클래스타입의 변수를 이용하여 자식 클래스들이 동일한 호출에 대해서 다르게 동작 할 수 있다.

– 순수가상함수를 쓰는 이유는?

순수가상함수를 선언하면 추상클래스가 되는데 다형성을 이용하여 자식클래스들을 하나의 리스트에 담아 사용하거나 할 수 있어 설계에 있어 유연하게 사용할 수 있다.

– 순수가상함수와 가상함수의 차이

순수가상함수는 인터페이스만을 계승하려는 목적으로 사용. 반드시 재정의 하여야 한다. 가상함수는 구현을 재정의 가능하게 하려는 목적으로 사용.

– virtual 함수?

vitrual 함수란 클래스 타입의 포인터로 멤버 함수를 호출할 때 동작하는 특별한 함수이다. 함수를 가상으로 선언하면 가상함수 테이블이 생성되고 이 함수의 포인터가 여기에 매핑된다 이후 자식 클래스가 해당 함수를 오버라이딩하면 이 함수의 포인터가 가상함수 테이블에 매핑되고

– vptr, vtable?

함수가 가상이 아닌 경우에는 컴파일시 어떤 함수를 호출하는지 알 수 있지만(정적 바인딩), 가상 함수의 경우 포인터에 의해 상속 관계의 어떤 함수도 호출 가능 하기 때문에 컴파일시 어떤 함수가 호출 될지 특정 할 수 없다. 그래서 가상 함수가 있는 경우 클래스에 자동으로 가상 함수 포인터와 가상 함수 데이블을 추가하고 런타임시 클래스 타입을 확인해서 해당 가상 함수 포인터를 찾은 뒤 포인터가 가르키는 곳의 테이블을 참조해서 해당 함수를 호출한다.(동적 바인딩)

– 포함과 상속의 차이

포함은 a라는 타입이 b라는 클래스 내부에 member로 있는 것. 단순히 member로서 있기 때문에 b가 변화해도 a에는 영향 없음

상속은 a라는 클래스가 b라는 클래스의 member를 모두 이어받아 기능을 추가 하는 것. b가 변경되면 a도 영향을 받음

– 포함과 상속.

파생클래스가 부모 클래스와 is-a 관계는 상속

클래스 2개가 has-a 관계는 포함.

– 상속 관계인 두 클래스에서 가상 함수가 아닌 리턴, 이름, 파라미터 모두 동일한 함수를 호출할 경우 어떤 클래스의 함수가 불리는가?

완전 동일하고 내용만 다른 함수가 부모 자식 간에 있을 경우 해당 타입의 클래스로 생성한 인스턴스는 해당 클래스의 함수를 호출하고 자식을 부모로 업케스팅 한 후 호출하면 부모의 함수가 호출된다.

– 파괴자를 virtual로 하는 이유는?

파괴자를 virtual로 하지 않으면 해당 클래스를 파괴할 시 자식 자신의 파괴자가 아닌 부모의 파괴자만 호출되어

자식의 member가 해제되지 않아 memory leak이 생긴다

– volatile 키워드란?

compile가 해당 변수를 최적화 하지 않게끔 해서 개발자의 의도대로 온전히 compile 되게한다

– volatile

컴파일러의 최적화를 막아 매번 메모리에서 값을 확인하여 사용할 수 있도록 한다. 메모리 배리어는 컴파일러에 따라 다르니 그냥 재배치 방지 정도로만 사용하거나 쓰레드에서 안전하다라는걸 보장하는 용도로 사용하는게 좋을듯 msvc에서의 volatile 키워드는 컴파일러 최적화를 막는다. volatile 키워드는 컴파일러, 프로그래밍 언어마다 그 뜻이 다르므로 잘 알아보고 쓰자. 특히 멀티스레디드 환경에서 함부로 쓰는 것은 주의해야 한다.

– volatile(볼러타일)

https://ko.wikipedia.org/wiki/Volatile_%EB%B3%80%EC%88%98

C/C++ 프로그래밍 언어에서 이 키워드는 최적화 등 컴파일러의 재량을 제한하는 역할을 한다. 개발자가 설정한 개념을 구현하기 위해 코딩된 프로그램을 온전히 컴파일되도록 한다. 주로 최적화와 관련하여 volatile가 선언된 변수는 최적화에서 제외된다. OS와 연관되어 장치제어를 위한 주소체계에서 지정한 주소를 직접 액세스하는 방식을 지정할 수도 있다. 리눅스 커널 등의 OS에서 메모리 주소는 MMU와 연관 된 주소체계로 논리주소와 물리주소 간의 변환이 이루어진다. 경우에 따라 이런 변환을 제거하는 역할을 한다. 또한 원거리 메모리 점프 기계어 코드 등의 제한을 푼다.

– explicit?

http://opensw.wikidot.com/cpp-fundamentals-explicit

explicit 키워드는 인자가 하나인 생성자가 암시적 형변환이 되지 않도록 해줍니다. 암시적 형변환이 되면 의도하지 않은 생성자가 불릴 수 있습니다.

– explicit

생성자가 명시적으로 호출되는건 괜찮치만 묵시적으로 호출되는것은 막는다.

Object obj = 10; // C스타일 에러.

Object obj(10); // cpp 스타일 오케이.

– mutable

const로 선언된 함수 내에서도 해당 변수에 값 할당 가능하게 함

– abstract 클래스와 interface 차이

abstract 클래스는 순수 가상 함수가 포함된 클래스를 말하며 함수가 구현부가 없기 때문에 instance를 생성할 수 없다. instance를 생성하려면 먼저 순수 가상 함수가 포함된 클래스를 상속 받아야 되며 모든 순수 가상 함수의 몸체를 구현해야 된다. 순수 가상 함수만으로 클래스를 구성해서 interface 처럼 만들 수 있지만 따로 구분하지는 않는다.

– dangling 포인터?

삭제된 instance의 주소를 가리키는 포인터

– 댕글링 포인터

동적할당한 메모리가 해제된 곳을 가리키고 있는 포인터. 메모리 해제후 해당 포인터 변수는 null 처리. 보통 매크로나 함수를 이용해서 해제 후 널처리.

– name mangling?

c는 오버로딩이 없어서 함수이름을 모두 다르게 정하기 때문에 컴파일시 문제가 없지만 cpp에서는 오버로딩이 가능하기 때문에 컴파일시 이름만 가지고는 어떤 함수를 말하는 건지 알 수가 없다. 그래서 컴파일러는 해당 함수가 정확히 어떤 함수인지 판단하기 위해 함수 이름에 파라미터 정보를 추가해서 정확히 알 수 있게한다. mangling 규칙은 컴파일러마다 다르다.

– smart 포인터?

기존 포인터를 사용하면서 발생하는 문제를 개선하기 위해 자동 해제, 자동 초기화가 되는 포인터

– 스마트포인터 주의사항.

순환참조가 일어나면 서로 참조하여 삭제되지 않는다.

삭제시 delete로 삭제되기 때문에 std::shared_ptr spi( new int[1024] ); 이런 배열선언은 안된다.

벡터쓰거나 델리터를 지정해라

– memory 단편화를 해결 할 수 있는 방법은?

memory pooling / free list / 프레임 기반 memory 할당 / low fragmentation heap api

– 멀티 코어를 활용할 수 있는 프로그래밍 기법들에 대해 아는 대로 설명

다중 스레드 / 다중 프로세스 / openmp / cpp ox ppl / intel tbb

– 멀티코어를 활용할수 있는 프로그래밍 기법.

멀티쓰레드, 멀티 프로세스, OpenMP, 병렬 프로그램 라이브러리(페럴라이즈), 인텔 TBB

– 프로세스

실행중인 프로그램.

코드, 데이터(스태틱), 힙, 스택으로 구성.

– 쓰레드

프로세스의 코드, 데이터, 힙은 공유. 스택은 별도.

beginthreadex를 사용.

beginthread는 쓰레드를 생성하고 핸들을 닫음. 반환된 핸들로 접근 할 수가 없다.

CreateThread는 쓰레드의 독립적인 메모리를 생성하지 않아 런타임 라이브러리 함수를 사용할때 문제가 있다.

– 쓰레드는 각 쓰레드별 고유 데이터를 가질 수 있게 되어 있다.이를 PTD(Per-Thread-Data)라고 한다.

beginthreadex시에 CreateThread 호출전에 선작업.

– 멀티 쓰레딩은 여러개의 쓰레드를 효과적으로 실행하는것. 프로그램 안에서 병렬처리.

– TLS는 정적, 전역 변수를 각각의 스레드에게 독립적으로 만들어 주고 싶을 때 사용. __declspec(thread)

– 멀티코어를 사용하는 이유

발열이나 에너지 효율 문제로 CPU의 성능이 올라가는 대신 여러개의 CPU를 장착하고 있다.

CPU의 성능의 증가보다 이제는 여러개의 CPU에 작업을 분산시키는 멀티쓰레딩 프로그래밍이 필요하다.

– 스레드는 써야 하는가?

멀티프로세서 환경에서 더 빠른 처리가가능하므로 사용한다.

쓰레드는 프로세스에서 같은 메모리 공간을 사용하고, 컨텍스트 스위칭 비용이 적기 때문에 사용해도 된다.

– culling 기법에 대해 나열

backface / frustum / occlusion / bsp, pvs / quad, octree

– 그림자를 생성하는 기법 나열

일반 텍스처 그림자 / projection / depthmap / volume

– struct와 class의 차이?

cpp – 구조상 완전히 동일하며 다른 점은 struct는 기본 접근자가 public이고 class는 기본 접근자가 private.

c# – 스트럭트는 값 타입이고 클래스는 참조 타입이다. 복사시 스트럭트는 값 복사가 됨. 스트럭트는 상속이 안됨.

– 구조체와 클래스의 차이점 (C, C++ 에서 어떻게 다른가?)

C에서 구조체는 멤버함수를 가질 수 없다. 클래스가 없다.

C++에서는 차이가 거의 없다. 구조체에서 멤버를 선언하면 기본으로 public , 클래스에서 멤버를 선언하면 기본으로 private 권한 차이.

– 템플릿

함수의 내용이나 클래스의 내용은 동일하지만 데이터타입이 다를 경우 재사용 할 수 있다.( 제너릭 프로그래밍 )

컴파일 타임에 컴파일러가 코드를 생성하여 실행시점의 연산을 줄여준다.( 메타프로그래밍 )

– 부동소수점

실수를 표현할때 소수점의 위치를 고정하지 않고 그 위치를 나타내는 수를 따로 적어내어 표현하는 방식.

유효숫자를 나타내는 가수부와 소수점의 위치를 나타내는 지수부로 나누어 표현한다.

부동소수점은 소수점연산시 문제를 갖고 있는데.

decimal 자료형의 사용. float보다는 double 자료형을 사용하고 소수점의 자리수를 고정하거나 반올림하여 사용.

정수형으로 변환하여 계산후 다시 실수형으로 변환하는 방법등이 있다.

– C와 C++ 차이.

C는 절차지향적 프로그래밍. 하향식 접근 방식. 함수기반.

C++은 다중패러다임 프로그래밍. 상향식 접근 방식. 객체중심.

– 정적, 동적 라이브러리?

정적은 말 그대로 정적인 라이브러리를 말한다. 링크 단계시 라이브러리가 실행 바이너리에 포함되어 별도의 작업없이 바로 사용가능 하다. 하지만 실행 바이너리 크기가 커지는 단점과 포함된 라이브러리가 많은 경우 메모리에서 차지하는 공간이 많아져 효율이 떨어진다. 동적은 정적과 반대로 사용하려는 실행 바이너리에서 필요시 사용할 수 있도록 최소한의 정보만 포함하여 링크하거나 완전 독립적으로 dll을 열고 쓰고 해제 할 수 있다.

– 전방선언은 왜 하는가?

파일간 컴파일 의존성 방지. 해당 전방선언이 수정되어도 컴파일 되지 않음 등 컴파일 이점

– 전방선언시 컴파일이 왜 단축되는가.

컴파일시 정의부 .cpp가 제외된다. 헤더파일에서는 포인터로 선언되어 주소의 크기만 알면 된다.

– 포인터와 레퍼런스

포인터는 A라는 변수의 실제위치를.

레퍼런스는 A라는 변수의 동의어를 하나더. 선언과 동시에 참조할 대상이 있어야 한다.

– float의 연산과 int의 연산중 int연산이 빠른데 구체적으로 어떤 차이가 있는가?

float 연산은 부동소수점 단정밀도 표현 방식으로 부호부 지수부 가수부가 있어서 그럴듯.

– cpp block이란?

함수나 익명함수, 람다식의 내용이 들어있는 곳을 말한다. 중괄호를 열고 닫아서 공간을 구분하며 하위 블럭 내부에서 생성된 변수는 상위 블럭에서 사용  할 수 없다. or 애플의 c, cpp, objective-c용 비표준 확장으로 람다식과 비슷한 구문으로 클로저를 작성하는 기능을 말한다.

– 클로저?

익명메서드나 람다식이 그것을 정의하고 있는 메서드(상위 메서드)의 로컬변수(파라미터 포함)를 사용하고 있을 때, 그 무명메서드 혹은 람다식을 Closure라 부른다.

– 카드가 100장이 있다. 이것을 고르게 섞으려고 하는데 어떻게 할것인가.

일단 STL을 사용가능하다면 random_shuffle 라이브러리를 사용할 것이고 직접 해야된다면 예전에 비슷한 컨텐츠를 만들어서 200여개 정도를 랜덤 셔플한적이있는데 그당시에는 검색해보다가 위키에서 피셔, 크누스 셔플 알고리즘을 보았었는데 선형알고리즘인걸 확인하고 그냥 사용하였다.

– “I am a boy”를 단어 자체의 글자 순서는 변하지 않고 단어들을 거꾸로 배열하는 함수를 만들어 봐라.

strtok으로 단어별로 쪼갠 후 스택에 푸시 팝하면 자동으로 거꾸로 배열..

– 3d에서 각도(degree)를 표시할 때 최소용량으로 줄일수 있는 법은?

정확도를 포기한다면 byte 0-255을 비율로 사용해서 각도 값으로 이용한다. 예) 180도 표현시 127 >> ( 127 + 1 ) / 256 == 0.5f >> 360.0f * 0.5f == 180.0f

– ++i 와 i++의 사용상의 차이점을 쓰시오

++i는 수행 시 증가된 값으로 적용

i++는 수행 후 값 증가.

i++는 ++i를 이용하여 구현된다. ++i가 빠르다

– 복사 생성자에 관련된 문제.

멤버변수에 포인터멤버가 있을 경우 디폴트 복사 생성자는 얕은 복사만 이루어진다.( 주소값만 복사 )

얕은복사는 참고하고있는 주소값이 변경되거나 소멸할경우 문제가 생긴다.

직접 복사생성자를 구현하던지 선언을 통하여 막아버리던지 할 것.

기본 복사 생성자는 호출시키는 객체의 선언과 동시에 초기화 되고 객체간의 멤버값을 복사해준다.

복사생성자의 호출 시점은 객체의 선언과 동시에 초기화 될때, 함수에 매개변수로 전달할때( Call by Value )

반환값으로 객체를 반환할떄 이다.

복사 생성자 원형

MyClass( MyClass& other );

MyClass( const MyClass& other );

MyClass( volatile MyClass& other );

MyClass( volatile const MyClass& other );

MyClass& operator=(const MyClass&); -> 대입 연산자

자동으로 생성되는 복사생성자를 방지하려면 생성자는 선언하고 빈값 대입은 선언만 하는 식으로 사용.

– 복사생성자를 컴파일 시간에 막기

Uncopyable이라는 클래스를 만들어 생성자와 소멸자를 protected로 만들고 복사 생성자와 복사대입연산자는 private의 형태로 함수만 선언 한다. 이 클래스를 private 상속 받는다.

– 메모리 지역성이란? 메모리 지역성을 이용해 만든 것 말해보라

참조했던 메모리는 빠른시간에 다시 참조될 확률이 높고( 시간적 지역성 )

참조된 메모리 근처의 메모리를 참조한다( 공간적 지역성 )

데이터가 순차적으로 액세스 되는 경우.( 순차적 지역성 )

메모리 지역성을 이용해 만든것 : 메모리 계층구조. 캐시 메모리

– 메모리배리어

컴파일러나 cpu가 최적화 중에 순서를 재배치 할 수 도 있다. 이러한 기능은 여러 쓰레드가 동시에 돌아가는경우 코드의 실행 순서가 바뀌어 실행되서 잘못된 결과를 낼 수 있다. 이러한 경우의 순차 실행을 보장하기 위한 것. volatile 키워드를 사용하여 재배치에서 제외시킬 수 있다. Win32 API에서의 각종 동기화 객체 함수, 인터락 함수 에서는 쓰레드를 블럭시키는 메모리 배리어가 사용된다.

– 48비트 레지스트

하드디스크에 있어 28비트 레지스트가 128GB까지 저장가능. 이러한 문제를 해결하기 위에서 나온게 48비트 레지스트

– 8bit범위

0 ~ 255, 2의보수 첫비트 음수 부호사용 -128 ~ 127

– 보수더하기

값을 +10했을때 의 값으로 바꿈. 총합 – ( 10 x -의 개수 ) = 답

9 – 7 + 5 – 3 + 7 == 9 + 3 + 5 + 7 + 7 == 31 – ( 10×2 ) = 11

– 32bit와 64bit 차이

CPU에서 연산 처리 차이. 2^32, 2^64

– 함수의 호출 과정.

호출규약이나 예외처리 여부에 따라 다른데 스택프레임을 사용하여 호출된다.

인자를 스택에 넣거나 프레임 포인터를 설정하는 준비과정

로컬 변수를 위한 공간을 할당, 호출한 함수의 실행상태 보존 실행과정

호출한 함수의 상태 복구, 스택정리, 프레임 포인터 정리, 호출 주소로 돌아간다, 스택 인자 정리. 마무으리

– const의 쓰임.

const는 변수, 포인터, 함수와 리턴자료형 같은 곳에서 사용 할 수 있다.

const를 사용하여 개발자가 의도한바가 변경되지 않도록 제약 할 수 있거나, 컴파일타임에 최적화 되기도 한다.

– 릴리즈 환경에서 디버깅은 어떻게?

빌드를 말하는거면 프로젝트 옵션에서 디버그가능하게 바꿀수있고

실제 라이브 환경을 말하는거면 원격디버깅을 할 수도 있다.

그런데 그냥 남는 덤프파일 가지고 분석하는게 더 나을것 같다.

값 초기화만 잘 해줘도 릴리즈에서 일어나는 대부분의 문제가 해결 가능하다.

– 하드웨어 추상계층은?

컴퓨터의 물리적인 하드웨어와 소프트웨어 사이의 추상화 계층. 하드웨어의 차이를 숨겨서 응용 프로그램이 작동 할 수 있는 일관된 플랫폼을 제공한다.

– 1MB는 int로 몇 개?

1MB = 1,024KB = 1,048,576B ( 1024 * 1024B ) = 1,048,576 / 4 = 262,144개

– memory fragmentation 메모리 단편화?

메모리가 할당되고 해제되다 보면 중간중간 비어서 사용할수 없는 공간이 생기게 되는 내부 단편화와, 전체 남은 메모리는 할당가능하지만, 실제로 연속된 메모리 공간이 부족한 경우인 외부 단편화가 있다. 해결 방법은 메모리풀, 윈도우 LFH, 프레임기반 메모리 할당 : 스택방식으로 사용하는 메모리풀, 자유 목록 템플릿 : 실행 시점에 할당 및 해제 gpg…, tcMalloc jemalloc 공짜점심

– 버그가 발생했을 때 대처방법은?

일단 버그를 재현해서 문제를 파악한다. 버그를 재현해보면 보통 어느정도 감이 오기때문에 코드를 확인 후 해결 가능하다. 그렇지 않을 경우에는 브레이크포인트를 걸고 디버깅을 한다.

– stack overflow란 무엇인가?

스택에서 사용가능한 공간 이상을 사용하게되면 발생. 무한루프에 빠지는 재귀함수. 스택보다 큰 변수 할당.

버퍼 오버플로우는 스택 오버플로우 (Stack Overflow), 힙 오버플로우 (Heap Overflow)를 포함한다.

스택 오버플로우는 콜 스택 (call stack)으로 할당된 공간이 넘칠만큼 서브 콜을 많이 하면 발생한다.

힙 오버플로우는 내부 구조체를 덮어쓰는 공격인 듯한데 왜 버퍼 오버플로우로 분류되는지 모르겠다.

버퍼 오버플로우는 버퍼 오버런 (Buffer Overrun)이라고 부르기도 한다.

산술 오버플로우는 연산의 결과값이 저장할 레지스터 (register)나 저장 위치보다 큰 경우에 발생한다.

언더플로우도 크게 버퍼 언더플로우 (Buffer Underflow)와 산술 언더플로우 (Arithmetic Underflow)로 나눌 수 있다.

버퍼 언더플로우는 빈 버퍼로부터 읽기가 발생하는 경우를 의미한다.

버퍼 언더플로우는 버퍼 언더런 (Buffer Underrun)이라고 부르기도 한다.

산술 언더플로우는 부동 소수점 (floating point) 연산 시 정상 표현 범위보다 작은 경우 발생한다.

가령 지수 부 (exponent part)는 -128에서 127까지 표현할 수 있지만, -128이 무한대로 예약되어 있기 때문에 이를 사용하면 언더플로우가 발생한다.

HEAP overflow-heap이 위에서부터 주소값을 채워져 내려오다가 stack영역을 침범하는 경우.

STACK overflow-stack영역이 heap을 침범

– 스택과 힙의 차이에 대해서 설명하라.

스택은 자동변수들이 저장되는 곳이고 함수가 호출될때 로컬변수 등이 저장된다. 함수 호출역시 저장 됨. LIFO
힙은 동적 메모리 할당을 할 경우 힙영역 사용. 메모리 공간.

– stack, heap크기는 얼마나 되는 것 같은가?

MSVC에서는 기본 1MB. 변경가능.

스택의 크기는 실행될때 결정되고

힙의 크기는 운영체제랑 메모리 크기에 영향을 받는다.

– 스레드에서 스택만 독립적인 이유

스택영역이 있어야 다른스레드와 다르게 함수를 호출한다거나 스택메모리에 사용되는 자동변수등을 처리 할 수 있다.

– static?

변수, 함수, 클래스 멤버 및 함수를 선언하는데 사용 할 수 있으며 컴파일타임에 메모리에 올라간다.

함수내부에서 선언되면 해당 함수 내에서 전역처럼 사용할 수 있고,

클래스에서 선언되면 파일범위에서 전역처럼 사용 할 수 있다.

– static_cast / dynamic_cast / reinterpret_cast / const_cast 관련 문제.

C스타일의 캐스트는 가독성이 좋지 않고 명시적이지 않아 의도를 파악하기 힘든 문제가 있다.

const_cast : const 속성이나 volatile 속성을 제거할떄 사용한다.

dynamic_cast : 상속관계에 있는 클래스간의 형변환에 사용한다. 형변환시 안전하지 않으면 NULL을 반환한다.

reinterpret_cast : 전혀 관계없는 타입간을 강제로 형변환 한다.

static_cast : 일반적인 형변환. 묵시적 형변환이 가능한것을 명시적으로 형변환한다. 클래스 상속관계도 허용한다.

– C,C++ 호출규약기술

– stdcall ( __stdcall )

Standard Calling Convention의 약자로, Windows API의 표준 호출 규약이다.

장점 : cdecl에 비해 오버헤드가 적다.

– cdecl ( __cdecl )

C언어 표준 함수의 표준 호출 규약이다.

– fastcall ( __fastcall )

Fast Calling Convention의 약자인듯 하다. __stdcall에서 약간 변형된 형태

장점 : stdcall의 장점을 취하고, stdcall의 인자 전달 방식을 개선

– thiscall ( __thiscall 직접 쓸때는 오류가 남 )

* COM Object에서 메서드를 처리하는 방법이다.

* stdcall에서 변형된 형태

cdcel : 오른쪽 -> 왼쪽 / 호출한곳 / 스택 / 가변인자 지원

stdcall : 오른쪽 -> 왼쪽 / 호출당한곳 / 스택 / 윈도우 표준 호출규약

fastcall : 오른쪽 -> 왼쪽 / 호출당한곳 / 앞에 두개 레지스터( edx/ecx ) 세번째부터 스택

thiscall : 오른쪽 -> 왼쪽 / 호출당한곳 / 스택 / ecx를 통해서 this 포인터 전달

– C,C++ RTTI ( Run Time Type Identification )

실행시간에 타입 정보를 식별 하는것.

클래스의 상속관계에서 가상함수 테이블에 정보가 저장되고

dynamic_cast, typeid, type_info를 사용하면 클래스의 자료형을 알 수 있게 된다.

– 구조체 패딩

#progma pack(1)

– 바이트 오더

1바이트를 넘어가는 일련의 바이트를 조합하는 순서에 따라 배열이 달라짐.

리틀인디언 : 인텔 계열. 하위에서 상위의 순서로 바이트 배열

빅인디언 : 자바. 모토로라계열. 상위바이트부터 순서대로.

– htonl()/ ntohl()

htonl : 빅인디언으로 변경

ntohl : 리틀인디언으로 변경

common에 댓글 닫힘 | cat > 사락사락