본문 바로가기

반응형

프로그래밍/C&C++

the rule of 0/3/5 혹시 구조체는 다음과 같은 것들을 구현해야 한다고 들어보신 적이 있으신가요?destructor copy constructor move constructor copy assignment move assignment오늘은 이것들이 무엇인지, 또 왜 필요한지를 한번 같이 살펴보도록 할게요.좌측값(lvalue)은 표현식이 끝나도 계속 사용이 가능한 값을 의미해요.auto lvalue {"69"};std::cout 우측값(rvalue)은 표현식이 끝나면 더 이상 사용이 불가능한 값을 의미해요.std::cout 소멸자(destructor)는 생명주기(life cycle)가 끝날 경우(e.g. scope) 자동으로 실행되는 함수예요.#include struct foo{ foo() { std::cout int{ .. 더보기
String & SSO 프로그래밍에서 문자열을 다루는 일은 굉장히 잦지만,문자열이 어떻게 구현되었는지 생각해 본 적 있으신가요? 물론 단순히 문자(character)의 배열(array)이라는 답도 근본적으로는 틀리지 않지만요 :3 ... 저번에는 유니코드 인코딩 방식을 위주로 설명했다면, 이번에는 문자열 구현체의 설계를 소개해보고자 해요.이번 글은 다양한 개념들을 한꺼번에 다루기에, 만약 기억이 안 나신다면 이전 글들을 확인해 보는 걸 추천드릴게요!문자열의 크기는 컴파일 시간(compile-time)에 알 수 없는 경우가 있어요. 크기를 알 수 없다면, 문자열의 내용을 stack 메모리에 저장할 수 없고,따라서 필연적으로 실행 시간(runtime)에 heap 메모리를 할당해야 해요.그리고 heap 메모리를 할당하는 작업은 성능.. 더보기
Union & Bit-field 만약 한정된 메모리에서, 한 종류의 값만 표현하는 것이 아니라,여러 종류의 값을 효율적으로 표현하고 싶으면 어떻게 해야 좋을까요?Union#include #include struct foo{ bool a; // 1 byte uint32_t b; // 4 byte};int main(){ std::cout struct fooapaddingbalignmentalignment1 byte1 byte1 byte1 byte1 byte1 byte1 byte1 byte 위 코드에서 구조체 foo의 필드는 각각 1, 4 byte를 사용해서 값을 표현하고 있어요.만약 a, b 중에서 항상 한 가지 필드만 사용한다는 가정 하에, 서로 다른 자료형을 표현하기 위해서구조체 패딩을 포함해 불필요한 메모리를 추가로 할당하는 것은 메.. 더보기
Struct Padding 구조체(struct)는 사용자가 임의로 정의한 연관된 정보(변수)를 이름으로 묶은 것을 의미해요.struct cat{ char* name; uint8_t age; }; 그럼 20000 ( ◡̀_◡́)ᕤ사실 여기서 끝난다면 글을 작성하지 않았겠지만요! 위와 같이 구조체의 각 필드는 각각의 자료형을 갖으며해당 자료형의 크기에 따라 구조체의 전체 크기 또한 커져요. 그렇다면 구조체가 메모리를 얼마나 점유하는지 계산해 볼까요?#include #include struct foo{ bool a; // 1 byte uint32_t b; // 4 byte};int main(){ std::cout  각 필드의 크기를 더하면 5(1 + 4)가  나오겠ㅈ..어라? 어떤 이유에서인지 8이 출력되는 것을 확인할 수 있어요.운영.. 더보기
Unicode 프로그래밍에서 문자열을 다루는 일은 굉장히 잦지만,문자열이 어떻게 구현되어 있는지 생각해 본 적 있으신가요? 물론 단순히 문자(character)의 배열(array)이라는 답도 근본적으로는 틀리지 않지만요 :3C/C++에서 배열은 암묵적(implicit)으로 포인터로 변형(decay)되어요. 이때, 배열의 범위 밖을 접근하는 경우,미정의 된 행동(undefined behaviour)이 발생하고 이는 굉장히 심각한 보안 취약점으로 이어질 수 있어요.따라서 함수에 배열을 전달할 때, 포인터와 배열의 길이를 둘 다 전달해줘야 하는 번거로움이 있어요.(혹은 template의 기능을 이용해 길이와 함께 배열의 참조(reference)를 전달할 수 있어요.)이처럼 매번 문자열의 포인터와 문자의 길이를 전달해줘야 하.. 더보기
Metaprogramming 혹시 메타인지라는 단어를 들어 보셨나요?메타인지는 자신에 대해서 자각하는 정도를 뜻하는 표현이에요.이와 비슷하게 메타프로그래밍은 프로그램 자신을 변형시키는 프로그래밍을 뜻해요. C++ 같은 컴파일 언어에서는 macro를 사용해 자동으로 코드를 생성 가능하고,Java 같은 런타임 언어에서는 reflection을 통해 코드를 실행 중에 분석 및 분기할 수 있어요.다만 macro/reflection은(는) 각각 컴파일/처리 시간을 증가시키기에 너무 빈번한 사용은 권장하지 않아요. reflection은 주로 특정한 이름 규칙이 있는 클래스를 동적으로 호출할 때, 메서드/필드의 접근자를 무시하고 호출할 때 (anti-pattern), 메서드/필드의 정보(e.g. 이름, 접근자)를 동적으로 분석 및 분기할 때, 등.. 더보기

반응형