나의 경우 주로 for문에서 후위증가를 사용했었고 타인의 코드를 볼 때 전위증가를 사용하는 사람이 있으면 그냥 스타일 차이인가 보다 하고 넘겼었는데 갑자기 궁금해져서 찾아보게 되었다. 전위증가와 후위증가의 차이는 결론적으로 전위증가가 더 효율적이다. for문내에서는 컴파일러가 전위증가를 사용하던 후위증가를 사용하던 별차이가 없다고는 하지만 실제로 list의 전위,후위 증가 연산자 오버라이딩 된 코드를 보면 전위연산자가 조금더 효율적인것 같다. _Self& operator++() _GLIBCXX_NOEXCEPT //전위증가 { _M_node = _M_node->_M_next; return *this; } _Self operator++(int) _GLIBCXX_NOEXCEPT //후위증가 { _Self __..
vector를 사용한 뒤 메모리를 해제해주기위해 보통 clear함수를 많이 호출한다. 그러나 clear함수는 vector에 저장된 값들은 제거되지만 vector에 할당 된 메모리는 삭제되지 않는다. 아래의 예를 보면 clear 함수 호출 후에도 capacity값이 남아 있음을 볼 수 있다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 #include #include using namespace std; int main(void) { vector vt; vt.push_back(10); vt.push_back(10); vt.push_back(10); vt.push_back(10); vt.push_back(10); vt.push_back(10); vt.clear(..
대부분의 경우 vector를 for문에 사용할 때 iterator를 사용하거나 초기화식을 int를 사용한다. iterator로 사용할 경우 문제없지만 초기화식 타입에 int를 사용할 경우 오버플로우를 발생할 수 있다. 왜냐하면 vector의 size는 정확히 말하면 signed int가 아니라 unsigned int 타입이기 때문이다. 따라서 이러한 버그가 발생하면 찾기도 힘드니 정확한 방법으로 vector를 사용하도록 한다. 예제 1234567891011121314151617181920#include #include using namespace std; int main(void) { vector vt; vt.push_back(10); vt.push_back(10); vt.push_back(10); vt..
C언어를 이용하여 라이브러리를 만들거나 프로그램 시작/종료시 메모리를 관리하고 싶을 때 아래의 코드에서처럼 __attribute__((constructor)) 와 __attribute__((destructor)) 사용하면 유용할 것 같다. 단점으로는 gcc컴파일에서만 활용할 수 있다는 점이다. 아래의 코드는 실행결과 처럼 constructor -> main -> AAA() - > BBB() -> CCC() -> main -> destructor 순으로 실행된다. 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 #include void __attribute__((constructor)) constructo..
STL을 활용하여 상한값 하한값 단순화하는 방법 보통의 경우 상한값 또는 하한값을 체크하는 경우 아래와 같이 구현한다. 1 2 3 4 5 6 7 if (result > 100) { //상한값 100 체크 result = 100; } if (result >input; input = checkMinMax(input, 0, 100); cout
순환참조 발생 원인 1) header 파일에서 서로 include하는 경우 2) 서로 Dependency가 발생한 경우 순환참조의 문제점 1번의 경우 서로가 서로의 헤더를 계속 포함시켜 컴파일 시 문제가 발생한다. 2번은 서로가 호출하는 경우로 모듈간의 커플링이 타이트해지는 문제점이 있다. 해결방법 1) 전방 선언을 통한 헤더 구성 전방 선언을 통해 헤더의 include없이 포인터만으로 class를 선언 할 수 있다. A.h 1 2 3 4 5 6 7 8 9 class B;//전방선언 class A { public: A() {}; void call(B* moduleB); void printA(); }; cs b.h 1 2 3 4 5 6 7 8 class A;//전방선언 class B { public: B(..
STL size()함수 주의사항 STL에서 제공하는 size()함수의 리턴타입을 찾아보면 아래와 같이 부호가 없는 정수형으로 나와있다. std::size_t is commonly used for array indexing and loop counting. Programs that use other types, such as unsigned int 따라서 size()함수를 통해 아래와 같은 코드를 작성하면 문제가 된다. for (int i=0; i < vt.size() - 1 ; i++) doSomething(); 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 #include #include using namespace std; ..
c++11 이후로 overide와 final 키워드를 사용할 수 있게 되었다. 간단하게 생각하면 virtual 함수를 오버라이드 하고 싶다면 override키워드를 무조건 함께 사용해주자. 이유는 아래의 예시를 보면 class B에서 가상 함수의 시그니처를 변경하 였을 경우 override 키워드를 사용하지 않은 코드는 컴파일 에러가 발생하지 않는다. 따라서 override키워드를 넣어줌으로써 가상 함수 시그니처 변경의 실수를 막을 수 있고 가독성 또한 좋아진다. 1234567891011121314151617181920212223242526272829class A {public: virtual void doSomething(int a) { cout