Penjajaran memori meletakkan pembolehubah dalam struktur data pada sempadan tertentu untuk meningkatkan kelajuan akses memori. Dalam C++, penjajaran memori boleh dicapai melalui makro atribut ((disejajarkan)) atau arahan pek #pragma. Sebagai contoh, menjajarkan ahli struktur kepada sempadan 4-bait boleh meningkatkan prestasi mengakses data ahli itu dengan ketara kerana komputer moden mengakses memori dalam blok 4-bait. Ujian penanda aras menunjukkan bahawa struktur sejajar diakses hampir dua kali lebih pantas berbanding struktur tidak sejajar.
Pengenalan
Penjajaran memori merujuk kepada meletakkan pembolehubah dalam struktur data pada alamat memori supaya ia boleh dibahagikan dengan integer saiz tertentu. Dalam C++, penjajaran memori boleh dicapai dengan menggunakan makro __attribute__ ((aligned))
atau arahan #pragma pack
. __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
Prinsip
Komputer moden mengakses memori dalam blok saiz tertentu yang dipanggil talian cache. Jika alamat pembolehubah diselaraskan dengan sempadan baris cache, data yang mengakses pembolehubah boleh dimuatkan ke dalam cache sekali gus. Ini boleh meningkatkan kelajuan akses memori dengan ketara.Contoh Praktikal
Pertimbangkan struktur berikut: 🎜#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);
__attribute__ ((aligned))
: 🎜Benchmark Time CPU Iterations ----------------------------------------------------------------------------------- BM_UnalignedAccess 12.598 ns 12.591 ns 5598826 BM_AlignedAccess 6.623 ns 6.615 ns 10564496
y
akan diselaraskan pada 4- sempadan bait, yang berfungsi Meningkatkan prestasi mengakses data y
. . struktur tidak sejajar. 🎜Atas ialah kandungan terperinci Teknologi penjajaran memori dalam pengoptimuman prestasi fungsi C++. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!