본문 바로가기

프로그래밍/C++

C++11 Emplace- SCOTT MEYERS 강의 후기 C++11 emplace 함수는 기존의 함수와는 또 다른 방식이다. 예를 들어 vector에 원소를 삽입할때 다음과 같이 할 수 있다. vs.push_back("XYXY"); vs.emplace("XYXY"); 작동은 동일하다. 하지만 내부적으로는 차이가 있는데 전자의 경우, 문자열 임시변수가 만들어지고 복사 그리고 임시변수 파괴의 과정을 거친다. 하지만 후자의 경우 벡터 컨테이너 안에서 직접 생성한다. std::vector::insert copies or moves the elements in to the container by calling copy constructor or move constructor. while, In std::vector::emplace elements are construc.. 더보기
C++11 constexpr - Scott Meyers 강의 후기 이번 2016 NDC에서 스캇메이어스 아저씨의 강연중 나온 내용이다. C++11 에서 추가된 CONSTEXPR! 스캇아저씨가 매우 흥미롭다며 소개해준 파트중 하나였는데, 일반적인 설명은 넷상에도 많이 있으니 참고하면 되고, https://msdn.microsoft.com/ko-kr/library/dn956974.aspx http://egloos.zum.com/sweeper/v/3147813 링크에도 나와있는 내용이지만, 언뜻 템플릿메타 프로그래밍과 비슷해 보이지만, 템플릿함수는 컴파일타임에 수행이 되므로 파라미터가 상수여야 하지만, constexpr 함수는 런타임에도 사용이 가능하다는 점이다. 또한 C++14에서 좀 더 제약이 적어졌다는 것이다. 그 예로 리턴표현식이 하나만 가능했던점이 여러개 지원이 가.. 더보기
long과 int는 크기가 같은데 같이 존재하는 이유 http://www.unix.org/version2/whatsnew/lp64_wp.html http://dev.likejazz.com/post/69840022906/long%EA%B3%BC-int%EB%8A%94-%ED%81%AC%EA%B8%B0%EA%B0%80-%EA%B0%99%EC%9D%80%EB%8D%B0-%EC%99%9C-%EC%A1%B4%EC%9E%AC%ED%95%98%EB%82%98%EC%9A%94 간단히 말하면 int형과 같은 primitive type은 컴파일러마다 다르기 때문이다. 더보기
C++11 새로운 Rand 함수를 써보자 이전의 rand()함수의 문제점은 난수함수의 최대 문제점인 데이터가 고르게 분포되지 않다는 점이,, 라고 한다라고 하지만, 가장 큰 문제점은 전역함수이므로 시드값을 프로그램 전체가 공유한다는 점이다. 때문에 사용자가 모르는 사이에 어디선가 호출이 되고, 시드가 변경되는 것을 컨트롤 하기가 다소 불편한점 있었다. static long holdrand = 1L; void srand(unsigned int seed) { holdrand = (long) seed;} int rand() { return (((holdrand = holdrand * 214013L + 2531011L) >> 16) & 0x7fff);}// 기존의 난수함수는 시드값이 전역변수라는게 문제였다! 대체방안으로 메르센 트위스터(MT.Merse.. 더보기
string::shrink_to_fit C++11 부터 std::string 에 shrink_to_fit() 이라는 함수가 추가 되었다. resize() 가 말그대로 size를 줄인다면, shrink_to_fit() 는 capacity를 줄이는 함수이다. 따라서 문자열을 축소할때 resize와 shrink_to_fit를 동시에 사용하면 실제 길이와 용량을 적절하게 줄일 수 있다. 그런데, shrink_to_fit 를 호출한다고 해서 반드시 capacity가 size와 일치하지는 않는다. VC에서 string의 기본메모리인 15이하는 줄어들지 않으며, 실제테스트 해 본 결과, 약간의 버퍼를 유지하고 있다. Shrink to fitRequests the string to reduce its capacity to fit its size. The r.. 더보기
C++ 컴파일오류 빌드오류 링크 https://msdn.microsoft.com/ko-kr/library/8x5x43k7.aspx 에러 번호별로 링크가 달려 있다 더보기
C++11 람다식 정리(lamda) [my_mod](int v_)->int{return v_ % my_mod;} //클로져 (Closure) 객체라고 명명 [] : 아무것도 캡처하지 않음 [&x] : x만 Capture by reference [x] : x만 Capture by value [&] : 모든 외부 변수를 Capture by reference [=] : 모든 외부 변수를 Capture by value [x, y] : x, y 를 Capture by value [&x, y] : x는 Capture by reference, y는 Capture by value [&x, &y] : x, y 를 Capture by reference [&, y] : y 를 제외한 모든 값을 Capture by reference [=, &x] : x 를 제.. 더보기
Visual C++ 데이터 형식(범위) 형식 이름바이트기타 이름값의 범위int4signed–2,147,483,648 ~ 2,147,483,647unsigned int4unsigned0 ~ 4,294,967,295__int81char-128 ~ 127unsigned __int81unsigned char0 ~ 255__int162short, short int 및 signed short int–32,768 ~ 32,767unsigned __int162unsigned short, unsigned short int0 ~ 65,535__int324signed, signed int 및 int–2,147,483,648 ~ 2,147,483,647unsigned __int324unsigned, unsigned int0 ~ 4,294,967,295__int64.. 더보기
매크로(define) 재정의 충돌문제 해결 Windows 8.0 SDK and DirectX SDK 가 충돌하여 몇몇 매크로가 충돌하는 경우가 생겼다. 보통 DX_SDK가 오래된 버전일때 이러한 경우가 생기는데, 여기에서 해결방법은 여러가지 방법이 있는데 다음과 같다. 1. DX_SDK를 include에서 제거 2. DX_SDK의 몇몇 old 함수를 사용하고 있다면, 프로젝트 세팅을 다음과 같이 변경project settings -> "General" -> "Platform Toolset"to "Visual Studio 2012 - Windows XP (v110_xp)" 3. 중복정의가 특별히 문제가 없다면 c4005 를 경고 무시에 추가 #include using namespace std; #define TEST "test1"#define TE.. 더보기
C++11 enum class 다음은 C++11 에서 강화된 enum 기능이다. 1. 중복 정의 가능 enum Car{SONATA,AVANTE,}; enum FakeCar{SONATA,AVANTE,}; 재정의로 에러가 난다. 하지만, class 한정자를 붙여주면? enum class Car{SONATA,AVANTE,}; enum class FakeCar{SONATA,AVANTE,}; 깔끔하게 컴파일 된다. 2. 타입 강화 enum Car : unsigned int{SONATA = 1,AVANTE = 2,}; enum FakeCar : unsigned int{SONATA2= 1,AVANTE2 = 2,}; if( Car::AVANTE == FakeCar::SONATA2 ){// 기존과 마찬가지로 컴파일 가능} 하지만, 위와 마찬가지로 c.. 더보기