Toolchain · STL · Performance

⚙️ C++ Alapok

Modern C++20/23 workflow: projektsablon, STL, RAII, build rendszer, profilozás és release tippek.

CMake RAII Sanitizers

1. Toolchain

# Linux/macOS
sudo apt install build-essential clang cmake

# Windows
winget install Kitware.CMake
winget install LLVM.LLVM

Használj egységes clang++ -std=c++20 -Wall -Wextra -Werror beállítást fejlesztéskor. VS Code-hoz ms-vscode.cpptools + CMake Tools.

2. Nyelvi alapok

#include <iostream>
#include <vector>

int main() {
    std::vector ints{1, 2, 3};
    for (int value : ints) {
        std::cout << value << '\n';
    }
    return 0;
}

Használd a auto-t a sablonos típusokra, de dokumentáld, ha fontos a konkrét típus.

3. Memóriakezelés és RAII

class ScopedTimer {
public:
    explicit ScopedTimer(std::string label)
        : label_(std::move(label)), start_(std::chrono::steady_clock::now()) {}
    ~ScopedTimer() {
        auto end = std::chrono::steady_clock::now();
        std::cout << label_ << " took "
                  << std::chrono::duration_cast<std::chrono::microseconds>(end - start_).count()
                  << "µs\n";
    }
private:
    std::string label_;
    std::chrono::steady_clock::time_point start_;
};

Preferáld az std::unique_ptr, std::shared_ptr tippeket; nyers pointer csak megfigyelő szerepben legyen.

4. STL és algoritmusok

#include <algorithm>
#include <optional>

std::optional<int> max_score(const std::vector<int>& scores) {
    if (scores.empty()) return std::nullopt;
    return *std::max_element(scores.begin(), scores.end());
}

A C++20 ranges API (<ranges>) tisztább láncokat ad: auto filtered = scores | std::views::filter(...).

5. Build rendszer

cmake_minimum_required(VERSION 3.26)
project(PowerFull LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)

add_library(powerfull STATIC src/lib.cpp)
target_include_directories(powerfull PUBLIC include)
add_executable(powerfull_app src/main.cpp)
target_link_libraries(powerfull_app PRIVATE powerfull)

Állíts be CMake preseteket (Debug/Release) és generálj compile_commands.json-t az LSP-nek.

6. Debug és diagnosztika

  • Sanitizers: -fsanitize=address,undefined -fno-omit-frame-pointer.
  • Valgrind memóriaszivárgáshoz (Linux).
  • lldb/gdb launch konfiguráció VS Code-ban.
  • cpptrace vagy Crashpad a stack trace-hez productionban.

7. Konkurencia és async

#include <syncstream>
#include <jthread>

std::mutex mutex;

void work(int id) {
    std::this_thread::sleep_for(std::chrono::milliseconds(200));
    std::osyncstream(std::cout) << "worker " << id << '\n';
}

int main() {
    std::jthread t1(work, 1);
    std::jthread t2(work, 2);
}

Használd az std::jthread-et, ami automatikusan join-ol. Komplex taskokra nézd a cppcoro / folly könyvtárakat.

8. Templates és Concepts

template<typename T>
concept ScoreContainer = requires(T t) {
    t.begin();
    t.end();
    requires std::totally_ordered;
};

template<ScoreContainer T>
auto top_score(const T& scores) {
    return *std::max_element(scores.begin(), scores.end());
}

A concepts megakadályozza a hosszú template hibákat, és jobb dokumentációs eszköz.

9. Profilozás és optimalizálás

  • Linux: perf + FlameGraph.
  • Windows: Visual Studio Performance Profiler.
  • Microbenchmark: google/benchmark.
  • Cache-friendly adatszerkezetek (SoA) és std::pmr allocátorok.

10. Release és csomagolás

# GitHub Actions példa
name: cpp-ci
on: [push]
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Install deps
        run: sudo apt install ninja-build
      - name: Configure
        run: cmake -S . -B build -G Ninja -DCMAKE_BUILD_TYPE=Release
      - name: Build
        run: cmake --build build --config Release
      - name: Tests
        run: ctest --test-dir build

Szállításkor állíts be LTO-t (-DCMAKE_INTERPROCEDURAL_OPTIMIZATION=ON), és használd a conan/vcpkg csomagkezelőt a harmadik féltől származó libekhez.