Heim >Backend-Entwicklung >C++ >Speicherausrichtungstechnologie zur Leistungsoptimierung von C++-Funktionen

Speicherausrichtungstechnologie zur Leistungsoptimierung von C++-Funktionen

PHPz
PHPzOriginal
2024-04-23 21:42:02573Durchsuche

Speicherausrichtung platziert Variablen in Datenstrukturen an bestimmten Grenzen, um die Speicherzugriffsgeschwindigkeit zu erhöhen. In C++ kann die Speicherausrichtung über das Attributmakro ((aligned)) oder die Direktive #pragma pack erreicht werden. Beispielsweise kann die Ausrichtung eines Strukturelements an einer 4-Byte-Grenze die Leistung beim Zugriff auf die Daten dieses Elements erheblich verbessern, da moderne Computer in 4-Byte-Blöcken auf den Speicher zugreifen. Benchmarktests zeigen, dass auf ausgerichtete Strukturen fast doppelt so schnell zugegriffen wird wie auf nicht ausgerichtete.

C++ 函数性能优化中的内存对齐技术

Speicherausrichtungstechnologie in der C++-Funktionsleistungsoptimierung

Einführung

Speicherausrichtung bezieht sich auf die Platzierung von Variablen in einer Datenstruktur an einer Speicheradresse, sodass sie durch eine Ganzzahl einer bestimmten Größe teilbar ist. In C++ kann die Speicherausrichtung mithilfe des Makros __attribute__ ((aligned)) oder der Direktive #pragma pack erreicht werden. __attribute__ ((aligned)) 宏或 #pragma pack 指令来实现。

原理

现代计算机以特定大小的块(称为缓存行)访问内存。如果变量的地址与缓存行的边界对齐,则访问该变量的数据可以一次性加载到缓存中。这可以显著提高内存访问速度。

实战案例

考虑以下结构体:

struct UnalignedStruct {
  int x;
  char y;
  double z;
};

此结构体未对齐,因为它没有将成员放置在内存地址的 4 字节边界上。可以通过使用 __attribute__ ((aligned)) 宏强制对齐此结构体:

struct AlignedStruct {
  int x;
  char y __attribute__ ((aligned (4)));
  double z;
};

现在,y 成员的地址将对齐到 4 字节边界上,这可以提高访问 y

Prinzip

Moderne Computer greifen auf den Speicher in Blöcken bestimmter Größen zu, die als Cache-Zeilen bezeichnet werden. Wenn die Adresse der Variablen an der Cache-Zeilengrenze ausgerichtet ist, können die Daten, die auf die Variable zugreifen, auf einmal in den Cache geladen werden. Dies kann die Speicherzugriffsgeschwindigkeit erheblich verbessern.

Praktisches Beispiel

Betrachten Sie die folgende Struktur: 🎜
#include <iostream>
#include <benchmark/benchmark.h>

struct UnalignedStruct {
  int x;
  char y;
  double z;
};

struct AlignedStruct {
  int x;
  char y __attribute__ ((aligned (4)));
  double z;
};

void BM_UnalignedAccess(benchmark::State& state) {
  UnalignedStruct s;
  for (auto _ : state) {
    benchmark::DoNotOptimize(s.y);  // Prevent compiler optimization
    benchmark::ClobberMemory();
  }
}

void BM_AlignedAccess(benchmark::State& state) {
  AlignedStruct s;
  for (auto _ : state) {
    benchmark::DoNotOptimize(s.y);  // Prevent compiler optimization
    benchmark::ClobberMemory();
  }
}
BENCHMARK(BM_UnalignedAccess);
BENCHMARK(BM_AlignedAccess);
🎜Diese Struktur ist nicht ausgerichtet, da sie keine Mitglieder an 4-Byte-Grenzen von Speicheradressen platziert. Sie können die Ausrichtung dieser Struktur erzwingen, indem Sie das Makro __attribute__ ((aligned)) verwenden: 🎜
Benchmark                         Time             CPU   Iterations
-----------------------------------------------------------------------------------
BM_UnalignedAccess             12.598 ns        12.591 ns     5598826
BM_AlignedAccess                6.623 ns         6.615 ns    10564496
🎜 Jetzt wird die Adresse des y-Mitglieds auf einer 4-Achsen-Achse ausgerichtet. Byte-Grenze, was funktioniert. Verbessern Sie die Leistung beim Zugriff auf y-Daten. 🎜🎜🎜Leistungsverbesserungen🎜🎜🎜Der folgende Benchmark vergleicht die Speicherzugriffsleistung von ausgerichteten und nicht ausgerichteten Strukturen: 🎜rrreee🎜Das Ausführen dieses Benchmarks generiert die folgenden Ergebnisse: 🎜rrreee🎜Wie die Ergebnisse zeigen, sind die Zugriffsgeschwindigkeiten ausgerichteter Strukturen fast doppelt so hoch wie nicht ausgerichtete Strukturen. 🎜

Das obige ist der detaillierte Inhalt vonSpeicherausrichtungstechnologie zur Leistungsoptimierung von C++-Funktionen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn