fmt library 를 사용해 보았다.

다 좋은데… 이 라이브러리는 타입이 안맞아서 컴파일 에러가 발생할때 도대체 어느 호출 부분에서 발생하는지 알수가 없다.
(에러메세지 외 추가 메세지를 보면 오류가 발생하는 함수의 원형이 보이는데, 로그호출의 형태가 거기서 거기인지라 알기 어렵다.)

에러 부위를 찾을때 주석으로 범위를 좁혀가면서 찾는것 말고는 방법이 없다.

이럴거면 차라리 런타임에 결과 문자열이 깨진걸 보고 찾는게 더 빠를것 같다.
물론 컴파일 타임에 에러가 발생하니 사전에 문제를 찾을수 있다는 장점이 있긴 하지만… 신나게 코드짜고 컴파일 했을때 발생하면 짲응

워드프레스를 설치해 보았다.

기존 테터툴즈에 있는걸 옮겨봐야 겠다.
워드프레스는 레이아웃이 어떤지 잘 모르겠다.
글을 한번 길게 써보자

어느 날 한 사람이 헤밍웨이에게 말했다.
“당신이 정말 훌륭한 소설가라면 적은 단어로 사람들을 울릴 수 있어야 하오.”
그리곤 한가지 내기를 제안했다.
“만약 열 단어 내외를 가지고 사람들을 감동 시킨다면 당신이 이기는 거요. 내기를 하겠소?”
헤밍웨이는 흔쾌히 내기를 수락했고 단 여섯 단어만으로 소설을 완성했다.

For Sale: Baby shoes, never worn.
팝니다: 아기 신발, 사용한 적 없음.

이 글의 의미는 아기가 생겨 미리 신발을 준비했지만 아기의 사망이나 입양 등 모종의 비극적인 사유로 아기가 신발을 못 신게 됐고, 돈이 없어 그마저도 팔아야하는 상황이다.

음 엔터로 글의 문단이 생긴다. 문단별로 폰트나 바탕색을 변경할수 있나 보다. 신기하다

이건뭐지??
산문?

음.. 이미지는 어떻게 넣지?

음 이렇게 넣나

뭔가 좀 어색한데. 이게 요즘 스타일인가..
글 하나하나를 정성것 써야하는 느낌이다

C++11의 random 성능 및 distrition 객체의 사용시 마다 생성 문제

c++11의 random 객체의 일반적인 예제를 보면 uniform_int_distribution 객체를 사용하는것이 보이는데
랜덤 변수 하나를 뽑을 때마다 해당 객체를 생성하는 형태로 만들어져 있다.

정말 저래도 괜찮은 걸까..? 테스트를 해봤음.

C의
rand() % 100 + 100

C++의

uniform_int_distribution<int> distribution(100, 199);
distribution(_generator);

코드를 첨부하긴 귀찮고.. 하여간 해봤을때

visual studio 2019에서 디버그 모드는 c++11의 코드가 느렸지만
릴리즈 모드는 서너빼 빠름

신박..

distribution 의 초기화 문제뿐 아니라 랜덤넘버 생성도 c++11은
mersenne_twister 를 쓰는데 우째 더 빠르지..

auto 변수는 레퍼런스 속성을 삭제한다.

아래 코드에서 보듯이 레퍼런스 속성이 삭제됨
그 외 const, volatile 속성 삭제
해당 속성을 유지 하고 싶다면 auto& 를 명확하게 써야한다.

#include <iostream>
using namespace std;

int main()
{
    int a = 10;
    int& b = a;
    auto c = b;
    c = 20;
    cout << a << ", " << b << ", " << c << endl;
    return 0;
}

10,10,20 출력

tuple 구현

#include <iostream>
#include <type_traits>
#include <typeinfo>
using namespace std;
template<typename … Types>
struct xtuple
{
    static constexpr int Size = 0;
};

template<typename T, typename … Types>
struct xtuple<T, Types …> : xtuple<Types …>
{
    T value;
    static constexpr int Size = xtuple<Types …>::Size + 1;
    xtuple() = default;
    xtuple(const T& t, Types … args) : value(t), xtuple<Types …>(args …) {}
};

template<int N, typename T> struct xtuple_get
{
};

template<typename T, typename … Types>
struct xtuple_get<0, xtuple<T, Types …>>
{
    using VT = T;
    using TT = xtuple<T, Types …>;
};

template<int N, typename T, typename … Types>
struct xtuple_get<N, xtuple<T, Types …>>
{
    using VT = typename xtuple_get<N – 1, xtuple<Types …>>::VT;
    using TT = typename xtuple_get<N – 1, xtuple<Types …>>::TT;
};

template<int N, typename T, typename … Types>
typename xtuple_get<N, xtuple<T, Types …>>::VT xget(xtuple<T, Types …>& xt)
{
    using TT = typename xtuple_get<N, xtuple<T, Types …>>::TT;
    return static_cast<TT&>(xt).value;
}

int main()
{
    int v0 = 10101;
    xtuple<int> a(1);
    xtuple<int, short, double> b(v0,2,3.4);
    cout << xget<0>(b) << endl;
    cout << xget<1>(b) << endl;
    cout << xget<2>(b) << endl;
}

push_back, emplace_back

push_back 으로 임시객체를 넣을 경우 임시객체의 생성과 소멸이 있다.
emplace_back 으로 임시객체를 넣을떄도 마찬가지
emplace_back을 효율적으로 쓰기 위해선 기존 객체를 move로 넣거나 생성자 인자를 변수로 넣어줘야 한다.

  1. #include <iostream>
  2. #include <string>
  3. #include <vector>
  4.  
  5. using namespace std;
  6.  
  7. class Data
  8. {
  9. string _name;
  10.  
  11. public:
  12.  
  13. Data(const string& name) : _name(name)
  14. {
  15. cout << "Data():" << _name << endl;
  16. }
  17. Data(const Data& rhs)
  18. {
  19. cout << "Data(const Data&):" << _name << ":" << rhs._name << endl;
  20. }
  21. Data(Data&& rhs)
  22. {
  23. _name = move(rhs._name);
  24. rhs._name = "null"; // for test
  25. cout << "Data(&&):" << _name << endl;
  26. }
  27. ~Data()
  28. {
  29. cout << "~Data():" << _name << endl;
  30. }
  31. };
  32.  
  33. int main()
  34. {
  35. cout << "push_back temporary object" << endl;
  36. {
  37. vector<Data> v;
  38. v.push_back(Data("test"));
  39. }
  40. getchar();
  41.  
  42. cout << "emplace_back temparory object" << endl;
  43. {
  44. vector<Data> v;
  45. v.emplace_back(Data("test"));
  46. }
  47. getchar();
  48.  
  49. cout << "emplace_back forward argument" << endl;
  50. {
  51. vector<Data> v;
  52. v.emplace_back("test");
  53. }
  54. getchar();
  55.  
  56. return 0;
  57. }

일하면서 잘 질문하는법.

신입이 몰라서 물어보는건 당연하지만, 잘 질문해야 한다고 생각함.

1. 우선 궁금한 부분을 짧고 간결하게 물어보고,
2. 왜 그게 궁금한지(어떤 작업을 위해서 필요한 내용인지) 설명하고
3. 본인이 이 부분을 알아보기 위해서 어떤 내용(삽질)을 살펴보았는지 설명해야한다

고 생각함.

그렇게 질문 받으면
신입이 정확한 방향으로 작업을 진행하고 있는지 파악이 가능하고, 살펴본 내용을 기반으로 설명해주기 쉽고, 마지막으로 성의가 느껴진다.