C++26: 컴파일 시점 표준 라이브러리 기능의 비약적 발전

2025-05-01

C++26은 표준 라이브러리의 constexpr 지원을 대폭 강화하여 컴파일 시점 프로그래밍에 혁신을 가져올 예정입니다. 여러 제안(P2562R1, P1383R2, P3074R7, P3372R2, P3508R0, P3369R0)을 통해 안정적인 정렬 알고리즘, 및 함수, 개선된 union 규칙, 거의 모든 컨테이너 및 어댑터, 그리고 특수화된 메모리 알고리즘이 constexpr로 지원됩니다. 이를 통해 컴파일 시점 기능이 크게 향상되어, 예를 들어 constexpr 컨테이너를 컴파일 시점에 정렬할 수 있습니다. 제약으로 인해 std::hive와 std::hash는 제외되지만, 전반적으로 C++26은 컴파일 시점 프로그래밍의 가능성을 획기적으로 확장할 것입니다.

더 보기
개발

C++26: constexpr의 비약적인 발전

2025-04-23

C++26은 constexpr에 혁명을 일으키려고 합니다! 향후 기능에는 void*로부터의 constexpr 캐스팅(컴파일 시 더욱 유연한 메모리 조작 가능), constexpr placement new(상수 표현식에서 객체 배치 가능), constexpr 구조화 바인딩(컴파일 시 구조화 바인딩 가능) 등이 있습니다. 이러한 개선으로 constexpr의 적용 범위가 크게 확대되고 표준 라이브러리는 컴파일 시 기능이 크게 향상됩니다.

더 보기

C++20 범위 성능: 놀라운 결과

2025-04-19

저자는 C++ 프로젝트에서 기본 루프를 `std::ranges::transform`으로 바꾸면서 성능 향상을 기대했습니다. 하지만 테스트 결과는 놀라웠습니다. 최적화된 기본 루프(`emplace_back` 및 `reserve` 사용)가 Clang에서는 20%, GCC에서는 10% 더 빨랐습니다. 이 글에서는 여러 가지 접근 방식을 비교하고 성능과 코드 가독성을 강조합니다. 결론적으로, 성능이 병목 현상이 아니라면 가독성이 높은 코드를 우선해야 합니다.

더 보기
개발 범위

C++26: 제거 및 더 이상 사용되지 않는 기능 요약

2025-03-20

C++26에서는 여러 기능이 제거되거나 더 이상 사용되지 않습니다. 여기에는 C++20에서 더 이상 사용되지 않는 `std::allocator` typedef의 완전한 제거, `std::basic_string::reserve()`의 인수 없는 오버로드 제거, 더 이상 사용되지 않는 Unicode 변환 유틸리티 및 `std::strtok` 제거, 오래된 `strstreams` 및 `std::shared_ptr`의 원자적 액세스 API 제거, `std::wstring_convert` 제거 등이 포함됩니다. 또한, `std::is_trivial`은 더 이상 사용되지 않으며, 더욱 정확한 `is_trivially_XXX`를 사용하는 것이 좋습니다. `std::memory_order::consume`도 사양이 불충분하고 구현이 어렵기 때문에 더 이상 사용되지 않습니다. 이러한 제거 및 더 이상 사용되지 않는 기능은 언어의 안전성과 효율성을 높이고 오래된 기능을 정리하기 위한 것입니다.

더 보기

C++26: 팩 인덱싱으로 요소 추출 간소화

2025-01-24

C++11에서 파라미터 팩이 도입되었지만, 특정 요소를 추출하는 것은 여전히 번거로운 작업이었습니다. 제안 P2662R3 덕분에 C++26에서는 팩 인덱싱이 도입되어, 첨자 연산자를 사용하여 팩 요소에 직접 접근할 수 있게 되었습니다. 예를 들어, `T...[0]`으로 첫 번째 요소에 접근할 수 있습니다. 이를 통해 코드가 더욱 깔끔하고 가독성이 높아지며, 컴파일 시간 성능도 향상됩니다. 음수 인덱싱이나 슬라이싱은 아직 지원되지 않지만, 이 기능은 이미 매우 실용적이며 C++ 개발을 크게 개선합니다.

더 보기

C++26: 이름 없는 자리 표시자 '_' 등장

2025-01-11

C++26은 획기적인 기능인 이름 없는 자리 표시자 '_'를 도입합니다. 이는 C++에서 오랫동안 골칫거리였던 사용되지 않은 변수 처리 문제를 해결합니다. 이전에는 개발자들이 `[[maybe_unused]]` 또는 `std::ignore`를 사용하여 컴파일러 경고를 피해야 했는데, 특히 구조화 바인딩에서 번거로웠습니다. '_' 자리 표시자는 충돌 없이 여러 번 선언할 수 있으며, 암시적으로 `[[maybe_unused]]` 속성을 가지므로 코드를 간소화하고 가독성을 향상시킵니다. 이 기능은 GCC 14와 Clang 18에 이미 구현되어 있습니다.

더 보기