📌 Оптимизация кода: std::string_view вместо std::string
Привет, друзья! Сегодня хочу рассказать про std::string_view — полезный инструмент, который может значительно ускорить работу с строками в C++. Многие из вас, вероятно, используют std::string, но не всегда это лучший выбор.
❓ Что такое std::string_view?
Это некопируемая, легковесная оболочка над строковыми данными. Она просто хранит указатель на начало строки и её длину, не создавая копии. Использование std::string_view вместо std::string позволяет избежать ненужных аллокаций памяти и ускорить код.
🔥 Пример использования:
🛠 Когда использовать?
✅ При передаче строк в функции, если их не нужно модифицировать.
✅ Для работы с подстроками (в отличие от
✅ Для обработки строк без создания динамических объектов.
⚠️ Важно помнить:
- std::string_view не владеет данными, поэтому нельзя использовать его для длительного хранения указателей на временные строки.
- Нужно быть осторожным с объектами, чей срок жизни может закончиться, пока
🚀 Итог:
Использование
А вы уже используете
#cpp #programming
👉 @cpp_lib
Привет, друзья! Сегодня хочу рассказать про std::string_view — полезный инструмент, который может значительно ускорить работу с строками в C++. Многие из вас, вероятно, используют std::string, но не всегда это лучший выбор.
❓ Что такое std::string_view?
Это некопируемая, легковесная оболочка над строковыми данными. Она просто хранит указатель на начало строки и её длину, не создавая копии. Использование std::string_view вместо std::string позволяет избежать ненужных аллокаций памяти и ускорить код.
🔥 Пример использования:
#include <iostream>
#include <string_view>
void print(std::string_view str) { // Без лишнего копирования
std::cout << str << '\n';
}
int main() {
std::string s = "Hello, world!";
print(s); // Можно передавать std::string
print("Hi there"); // Можно передавать строковый литерал
}
🛠 Когда использовать?
✅ При передаче строк в функции, если их не нужно модифицировать.
✅ Для работы с подстроками (в отличие от
std::string::substr
, который делает копию). ✅ Для обработки строк без создания динамических объектов.
⚠️ Важно помнить:
- std::string_view не владеет данными, поэтому нельзя использовать его для длительного хранения указателей на временные строки.
- Нужно быть осторожным с объектами, чей срок жизни может закончиться, пока
std::string_view
ещё используется.🚀 Итог:
Использование
std::string_view
вместо const std::string&
может ускорить работу с текстовыми данными и снизить нагрузку на аллокатор. Если не нужно изменять строку — это отличный выбор! А вы уже используете
std::string_view
в своих проектах? Делитесь в комментариях! ⬇️#cpp #programming
👉 @cpp_lib
👍5👏3
📌 5 способов ускорить компиляцию C++ проекта
Всем доброго вечера, или утра✌️ Компиляция C++ — боль, особенно на больших проектах. Сегодня расскажу, как ускорить этот процесс.
🚀 1. Используйте
🔹
🔹 Установка (Linux/macOS):
🔹 Использование:
⚡ 2. Включите
🔹 Используйте
🔹 Это позволяет компилятору использовать несколько ядер процессора.
🔥 3. Используйте
🔹 Если у вас много инклудов в
🔹 Теперь подключайте
💨 4. Разделяйте сборку на модули
🔹 Используйте
🔹 Или попробуйте C++ модули (`export module`) в новых компиляторах.
🏎️ 5. Собирайте в
🔹 Используйте
🔹 Для дебага —
Как вы ускоряете сборку? Пишите в комментариях! 🚀
#cpp #programming
👉 @cpp_lib
Всем доброго вечера, или утра
🚀 1. Используйте
ccache
🔹
ccache
кеширует результаты компиляции и повторно использует их при неизменности исходного кода. 🔹 Установка (Linux/macOS):
sudo apt install ccache # для Ubuntu
brew install ccache # для macOS
🔹 Использование:
export CC="ccache g++"
export CXX="ccache g++"
⚡ 2. Включите
-j
в make
🔹 Используйте
make -jN
, где N
— количество потоков. Например:
make -j$(nproc) # на Linux
make -j$(sysctl -n hw.ncpu) # на macOS
🔹 Это позволяет компилятору использовать несколько ядер процессора.
🔥 3. Используйте
pch
(предкомпилированные заголовки) 🔹 Если у вас много инклудов в
.cpp
файлах, создайте pch
файл:
// stdafx.h
#include <iostream>
#include <vector>
#include <map>
g++ -o stdafx.pch stdafx.h
🔹 Теперь подключайте
stdafx.pch
вместо кучи инклудов.💨 4. Разделяйте сборку на модули
🔹 Используйте
Unity Build
(объединение нескольких .cpp
в один). 🔹 Или попробуйте C++ модули (`export module`) в новых компиляторах.
🏎️ 5. Собирайте в
Release
с оптимизациями 🔹 Используйте
-O2
или -O3
, если важна скорость. 🔹 Для дебага —
-Og
:
g++ -Og -g main.cpp -o main
Как вы ускоряете сборку? Пишите в комментариях! 🚀
#cpp #programming
👉 @cpp_lib
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🤣2
🧑💻 C++ шпаргалка
🔹 Основы синтаксиса:
Комментарии:
🔹 Ввод/вывод:
🔹 Типы данных:
🔹 Условия и циклы:
🔹 Функции:
🔹 Массивы и векторы:
🔹 Стандартные библиотеки:
🔹 STL:
Векторы, карты, множества, строки, стек и очередь
📎 Подробнее: https://www.geeksforgeeks.org/cpp-cheatsheet/
#cpp #programming
👉 @cpp_lib
🔹 Основы синтаксиса:
int main() { ... }
Комментарии:
// однострочный
или /* многострочный */
🔹 Ввод/вывод:
cin >> x;
— вводcout << x;
— вывод🔹 Типы данных:
int, float, double, char, bool, string
🔹 Условия и циклы:
if, else, switch
for, while, do-while
🔹 Функции:
returnType name(args) { ... }
🔹 Массивы и векторы:
int arr[10];
vector<int> v;
🔹 Стандартные библиотеки:
#include <iostream>
#include <vector>
#include <algorithm>
🔹 STL:
Векторы, карты, множества, строки, стек и очередь
📎 Подробнее: https://www.geeksforgeeks.org/cpp-cheatsheet/
#cpp #programming
👉 @cpp_lib
👍9😁6👎2
Как правильно вызывать CUDA
Вероятно, вам уже попадались подобные руководства по CUDA: хрестоматийный пример «Hello World», в котором перемешан код для ЦП и графического процессора. Всё это сложено в один гетерогенный файл с исходниками на CUDA C++, а для запуска ядра применяется синтаксис NVCC с тройными угловыми скобками <<<>>>, который уже стал культовым:
Время идёт, а такой паттерн по-прежнему попадается мне в продакшен-коде. Признаюсь, кое-где он всплывает и в моих любительских проектах — раз, два, три. Но это не лучшая идея, полагаться в серьёзном коде на запуск ядра через тройные угловые скобки. В таком случае программа не возвращает коды ошибок, поэтому может показаться обманчиво простой. Ниже вас ждут примерно 25 килобайт текста, в которых мы обсудим не самые корявые способы запуска ядер.
https://ashvardanian.com/posts/less-wrong-cuda-hello-world/
#cpp #programming
👉 @cpp_lib
Вероятно, вам уже попадались подобные руководства по CUDA: хрестоматийный пример «Hello World», в котором перемешан код для ЦП и графического процессора. Всё это сложено в один гетерогенный файл с исходниками на CUDA C++, а для запуска ядра применяется синтаксис NVCC с тройными угловыми скобками <<<>>>, который уже стал культовым:
#include <cuda_runtime.h>
#include <stdio.h>
__global__ void kernel() {
printf("Hello World from block %d, thread %d\n", blockIdx.x, threadIdx.x);
}
int main() {
kernel<<<1, 1>>>(); // Возвращает `void`?!
return cudaDeviceSynchronize() == cudaSuccess ? 0 : -1;
}
Время идёт, а такой паттерн по-прежнему попадается мне в продакшен-коде. Признаюсь, кое-где он всплывает и в моих любительских проектах — раз, два, три. Но это не лучшая идея, полагаться в серьёзном коде на запуск ядра через тройные угловые скобки. В таком случае программа не возвращает коды ошибок, поэтому может показаться обманчиво простой. Ниже вас ждут примерно 25 килобайт текста, в которых мы обсудим не самые корявые способы запуска ядер.
https://ashvardanian.com/posts/less-wrong-cuda-hello-world/
#cpp #programming
👉 @cpp_lib
👍5❤1