C++ в реальных проектах: кейсы компаний, которые вас удивят
Когда мы слышим "C++", большинство сразу вспоминает университетские лабораторные, консольные калькуляторы и бесконечные споры про умные указатели. Но на самом деле C++ — это язык-невидимка, на котором работают самые критичные системы в мире. Без него не взлетит самолёт, не загрузится Google, не запустится ваша любимая игра. В этой статье мы разберём реальные кейсы компаний, которые используют C++ в production, посмотрим на живой код и поймём, почему этот язык до сих пор в топе.
Почему C++ до сих пор актуален? (Краткий ликбез)
Прежде чем нырнуть в кейсы, давайте вспомним главные фишки C++, которые делают его незаменимым в реальных проектах:
- Производительность без компромиссов — ручное управление памятью и zero-cost abstractions позволяют выжать максимум из железа.
- Прямой доступ к аппаратуре — идеально для embedded, драйверов и ОС.
- Многопоточность и асинхронность — современный C++ (11/14/17/20) даёт мощные инструменты для параллелизма.
- Огромная кодовая база — миллионы строк legacy-кода, который никто не перепишет на Rust или Go.
Теперь перейдём к самому интересному — как это выглядит в реальных компаниях.
Кейс 1: Google — поиск и не только
Где используется C++ в Google?
Вы удивитесь, но Google — один из крупнейших потребителей C++ в мире. На C++ написаны:
- Ядро поисковой системы (Google Search).
- Chrome (движок Blink, V8).
- TensorFlow (часть бэкенда).
- Google File System и Bigtable.
Реальный код из Google: умные указатели и производительность
Google активно использует свои собственные умные указатели (например, std::unique_ptr и кастомные absl::StatusOr). Вот упрощённый пример, как в Google обрабатывают ошибки без исключений (исключения запрещены в большей части кода):
#include <absl/status/statusor.h>
#include <iostream>
// Функция, которая может вернуть ошибку
absl::StatusOr<int> Divide(int a, int b) {
if (b == 0) {
return absl::InternalError("Деление на ноль запрещено!");
}
return a / b;
}
int main() {
auto result = Divide(10, 2);
if (result.ok()) {
std::cout << "Результат: " << *result << std::endl;
} else {
std::cerr << "Ошибка: " << result.status().message() << std::endl;
}
return 0;
}
Почему так? В высоконагруженных системах исключения могут быть дорогими. Google предпочитает явную проверку ошибок через StatusOr — это даёт предсказуемую производительность.
Кейс 2: Facebook (Meta) — социальная сеть на C++
Где C++ в Facebook?
Facebook использует C++ в нескольких ключевых компонентах:
- HHVM — виртуальная машина для PHP (написана на C++).
- Folly — библиотека для высокопроизводительного C++.
- Proxygen — HTTP-фреймворк.
- Часть бэкенда для ленты новостей.
Пример: асинхронный HTTP-сервер с Proxygen
Facebook разработала Proxygen для обработки миллионов запросов в секунду. Вот как выглядит минимальный эхо-сервер:
#include <proxygen/httpserver/HTTPServer.h>
#include <proxygen/httpserver/RequestHandler.h>
#include <proxygen/httpserver/ResponseBuilder.h>
using namespace proxygen;
class EchoHandler : public RequestHandler {
public:
void onRequest(std::unique_ptr<HTTPMessage> headers) noexcept override {}
void onBody(std::unique_ptr<folly::IOBuf> body) noexcept override {
body_ = std::move(body);
}
void onEOM() noexcept override {
ResponseBuilder(downstream_)
.status(200, "OK")
.body(std::move(body_))
.sendWithEOM();
}
void requestComplete() noexcept override { delete this; }
void onError(ProxygenError err) noexcept override { delete this; }
private:
std::unique_ptr<folly::IOBuf> body_;
};
int main() {
HTTPServerOptions options;
options.threads = 4;
HTTPServer server(std::move(options));
server.bind(8080);
server.start();
return 0;
}
Фишка: Использование folly::IOBuf для эффективной работы с буферами без лишних копирований. Это критично для скорости.
Кейс 3: Unreal Engine — игры и не только
C++ в геймдеве: Unreal Engine 5
Unreal Engine написан на C++ с нуля. Это не просто "игровой движок" — на нём делают:
- AAA-игры (Fortnite, Gears of War).
- Виртуальную реальность.
- Кино и анимацию (The Mandalorian).
- Симуляторы для авто и авиации.
Пример: кастомный актор в Unreal C++
Вот как выглядит простой вращающийся куб на C++ в Unreal Engine 5:
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "RotatingCube.generated.h"
UCLASS()
class MYPROJECT_API ARotatingCube : public AActor {
GENERATED_BODY()
public:
ARotatingCube();
virtual void Tick(float DeltaTime) override;
protected:
UPROPERTY(EditAnywhere, Category="Rotation")
float RotationSpeed = 50.0f;
private:
UPROPERTY()
UStaticMeshComponent* Mesh;
};
// Реализация
ARotatingCube::ARotatingCube() {
PrimaryActorTick.bCanEverTick = true;
Mesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("Mesh"));
RootComponent = Mesh;
}
void ARotatingCube::Tick(float DeltaTime) {
Super::Tick(DeltaTime);
AddActorLocalRotation(FRotator(0, RotationSpeed * DeltaTime, 0));
}
Важно: Unreal использует собственную систему рефлексии (макросы UCLASS, UPROPERTY) для интеграции с Blueprints и редактором. Это мощный, но специфичный подход.
Кейс 4: Embedded и IoT — C++ в микроконтроллерах
Где C++ в embedded?
Многие думают, что embedded — это только C, но C++ всё чаще используется в:
- Автомобильных системах (AUTOSAR).
- Дронах и роб