'folly'에 해당되는 글 1건

  1. 2014.04.04 folly code reading #1 (2014년 3월)


Folly의 3월달 커밋에서 본 몇가지 사항 정리.


1.

gcc를 많이 사용하지 않다보니 __PRETTY_FUNCTION__을 깜빡할때가 많다.

이것은 signature까지 포함된 함수명을 넘겨주는 매크로이다.

VC++에서는 비슷하게 __FUNCTION__, __FUNCDNAME__, __FUNCSIG__ 등이 제공된다.


2.

VC++에서 테스트한 결과이다.

람다함수 내에서 __FUNCTION__을 사용하면 "원래함수::<lambda_{hash hex}>::operator()"가 전달된다.


3.

결국 저 커밋은 간단하게  NULL체크를 수행한 후, NULL이면 예외를 던지는 코드이다.


char * pTest = nullptr;
int i = pTest ? 1 : [] {
         throw logic_error(" null point");
         return 0;
     } ();


람다함수식 뒤의 ()는 람다함수를 바로 호출하는 것을 의미한다.



4.

NULL을 nullptr로 사용하기.


5.

대소문자 구별하지 않는 알파벳 비교.

보통은 주어진 문자를 대문자 또는 소문자로 변환해서 같은지를 비교한다.

그런데 folly에서 개선한 방법은 비트연산자를 이용하는 것이다.

결국 영문 알파벳의 경우 대소문자가 처음 4비트값만 다르다. 0x4?/0x5?이면 대문자, 0x6?/0x7?이면 소문자영역다.

개선된 알고리즘은 다음과 같다.


struct AsciiCaseInsensitive {
  bool operator()(char lhs, char rhs) const 
  {
    char k = lhs ^ rhs; 
    if (k == 0) return true;// 같은 글자였다면 XOR연산값이 0일 것이다.
    if (k != 32) return false; // 만약 대소문자가 다르다면 XOR연산값이 32가 되어야 한다.
    k = lhs | rhs; // 32가 되더라도 특수문자 영역일 수 있으므로 OR연산을 수행한다. 이제 K는 무조건 소문자로 변환된다.
    return (k >= 'a' && k <= 'z'); // 변환된 글자가 알파벳 소문자 영역인지 확인한다.
  }
}

테스트케이스 주석문에 따르면 예제 텍스트에 대해 기존의 toupper()를 사용하는 방식은 9.04초가 걸린 반면 이 방식은 2.96초가 걸려 시간이 1/3로 단축되었다.

Posted by NeoZest