Rumah pembangunan bahagian belakang Golang mengoptimumkan susun atur c struct

mengoptimumkan susun atur c struct

Jan 03, 2025 pm 01:57 PM

Mari kita pertimbangkan struct c mudah:

struct foo {
    const char * str;
    unsigned char flag;
    uint64_t len;
};
Salin selepas log masuk
Salin selepas log masuk

Andaikan kod ini sedang dijalankan sebagai sebahagian daripada program yang dilaksanakan pada mesin 64-bit: apakah yang anda jangkakan hasil sizeof(struct foo)?

Kebanyakan orang yang tidak pernah perlu mengacau dengan saiz dan pengoptimuman struktur akan meneka bahawa ia sepatutnya 17...

... tetapi dah 24! Kenapa begitu?

Sebab bagi tingkah laku ini ialah pengkompil mengoptimumkan reka letak struktur untuk kelajuan, dan ia adalah norma moden bahawa akses memori yang sejajar adalah cara terpantas untuk mengakses data.

Ini bermakna, bergantung pada jenis medan dan cpu, data anda akan mempunyai beberapa penjajaran dan akan diposisikan supaya penjajaran itu dihormati (atau, supaya alamat medan % penjajaran medan == 0).

saiz, penjajaran, padding

Dalam kes contoh sebelumnya, penunjuk dan medan 64-bit adalah sejajar 8B pada mesin 64-bit, dan ini bermakna, untuk memaksa susun atur di mana semua dalam struct diselaraskan, pengkompil akan menjana beberapa pelapik antara medan bendera dan len:

optimizing c structs layouts

Sekarang mari kita pertimbangkan contoh lain, di mana struct seperti ini ditakrifkan, pada mesin yang sama seperti sebelum ini:

struct bar {
    const char * str;
    short s1;
    int i1
    short s2;
    int i2;
};
Salin selepas log masuk
Salin selepas log masuk

Bagaimanakah kita hendak mengira saiznya?

Terdapat tiga peraturan:

  • Medan struktur mahu diselaraskan dengan penjajaran semula jadinya sendiri.
  • Penjajaran struktur keseluruhan adalah sama dengan penjajaran medan terluasnya
  • Jika anda terpaksa meletakkan dua struct daripada jenis yang sama bersebelahan, yang kedua harus dijajarkan dengan penjajarannya -- ini bermakna bahawa struct mesti mempunyai pelapik mengekor sehingga penjajarannya

Imbasan pantas tentang penjajaran jenis asas dan saiz untuk mesin 64-bit:

type size alignment
char 1 1
short 2 2
int 4 4
long 8 8
float 4 4
double 8 8
pointers 8 8

Juga ingat bahawa:

  • Tatasusunan mempunyai penjajaran jenis nilainya dan saiz yang saiz(jenis) * nombor elemen.
  • Kesatuan mempunyai penjajaran dan saiz ahli terluas mereka.

Dan anda boleh menggunakan operator saiz yang sangat berguna dan _Alignof untuk mendapatkan maklumat ini untuk jenis tersuai anda. Ambil perhatian bahawa _Alignof tersedia dari C11 dan seterusnya, dan dipanggil alignof bermula dengan C23. Ia sentiasa sejajar dengan apa yang saya faham dalam C , sejak C 11.

Untuk maklumat lanjut, bible mengenai topik ini ialah The Lost Art of Structure Packing, dari mana saya mempelajari hampir semua yang saya ketahui tentang perkara ini, bersama-sama dengan banyak latihan dan pengalaman praktikal.

mengoptimumkan struct anda: stropt

Topik ini di sini adalah sesuatu yang agak kerap muncul di tempat kerja, di mana penjimatan bait di sana sini adalah sangat penting apabila menghantar banyak data yang besar secara berterusan dalam baris gilir dan sebagainya.

Untuk menjadikan hidup saya lebih mudah, saya menulis alat yang menghasilkan beberapa statistik pada jenis yang anda berikan sebagai input, dengan merujuk kepada fail sumber atau coretan kod, ia dipanggil stropt (pengoptimum struktur).

Abathargh/stropt di GitHub

bina & pasang

Jika anda mempunyai pemasangan go setempat, anda boleh terus membina atau memasang aplikasi secara terus:

struct foo {
    const char * str;
    unsigned char flag;
    uint64_t len;
};
Salin selepas log masuk
Salin selepas log masuk

Perduaan yang sudah disusun untuk senarai gabungan os/archs juga disediakan dalam halaman keluaran github:

perduaan stropt

menggunakan alat tersebut

Anda boleh sama ada menggunakan stropt dengan menghantar sumber untuk menganalisis sebagai rentetan:

struct bar {
    const char * str;
    short s1;
    int i1
    short s2;
    int i2;
};
Salin selepas log masuk
Salin selepas log masuk

optimizing c structs layouts

Atau anda boleh menghantar fail yang mengandungi definisi:

git clone https://github.com/Abathargh/stropt
go build

// or, if you want to install this directly
go install github.com/Abathargh/stropt
Salin selepas log masuk

optimizing c structs layouts

Alat ini juga boleh memberikan kemungkinan pengoptimuman untuk jenis anda dengan menggunakan bendera -optimize, dan ia mengetahui medan yang merupakan struct itu sendiri:

optimizing c structs layouts

Perhatikan bahawa bendera verbose digunakan untuk menunjukkan struktur dalam (dan kesatuan) bersama-sama dengan penjajaran medan dan saiznya.

apa seterusnya

Alat ini ditulis dalam go menggunakan pengkompil C modernc.org/cc yang hebat untuk menghurai kod C dan lipgloss daripada charmbracelet untuk UI.

Saya menulis ini untuk diri saya sendiri tetapi saya gembira untuk berkongsinya secara terbuka; Saya ingin menjadikan ini apl web untuk kegunaan yang lebih mudah secara terus dalam penyemak imbas, jadi mungkin itulah perkara seterusnya yang akan saya usahakan!

Atas ialah kandungan terperinci mengoptimumkan susun atur c struct. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Tujuan Golang: Membina sistem yang cekap dan berskala Tujuan Golang: Membina sistem yang cekap dan berskala Apr 09, 2025 pm 05:17 PM

Pergi bahasa berfungsi dengan baik dalam membina sistem yang cekap dan berskala. Kelebihannya termasuk: 1. Prestasi Tinggi: Disusun ke dalam Kod Mesin, Kelajuan Berjalan Cepat; 2. Pengaturcaraan serentak: Memudahkan multitasking melalui goroutine dan saluran; 3. Kesederhanaan: sintaks ringkas, mengurangkan kos pembelajaran dan penyelenggaraan; 4. Cross-Platform: Menyokong kompilasi silang platform, penggunaan mudah.

Golang dan C: Konvensyen vs kelajuan mentah Golang dan C: Konvensyen vs kelajuan mentah Apr 21, 2025 am 12:16 AM

Golang lebih baik daripada C dalam kesesuaian, manakala C lebih baik daripada Golang dalam kelajuan mentah. 1) Golang mencapai kesesuaian yang cekap melalui goroutine dan saluran, yang sesuai untuk mengendalikan sejumlah besar tugas serentak. 2) C Melalui pengoptimuman pengkompil dan perpustakaan standard, ia menyediakan prestasi tinggi yang dekat dengan perkakasan, sesuai untuk aplikasi yang memerlukan pengoptimuman yang melampau.

Perlumbaan Prestasi: Golang vs C Perlumbaan Prestasi: Golang vs C Apr 16, 2025 am 12:07 AM

Golang dan C masing-masing mempunyai kelebihan sendiri dalam pertandingan prestasi: 1) Golang sesuai untuk kesesuaian tinggi dan perkembangan pesat, dan 2) C menyediakan prestasi yang lebih tinggi dan kawalan halus. Pemilihan harus berdasarkan keperluan projek dan tumpukan teknologi pasukan.

Golang vs Python: Prestasi dan Skala Golang vs Python: Prestasi dan Skala Apr 19, 2025 am 12:18 AM

Golang lebih baik daripada Python dari segi prestasi dan skalabiliti. 1) Ciri-ciri jenis kompilasi Golang dan model konkurensi yang cekap menjadikannya berfungsi dengan baik dalam senario konvensional yang tinggi. 2) Python, sebagai bahasa yang ditafsirkan, melaksanakan perlahan -lahan, tetapi dapat mengoptimumkan prestasi melalui alat seperti Cython.

C dan Golang: Apabila prestasi sangat penting C dan Golang: Apabila prestasi sangat penting Apr 13, 2025 am 12:11 AM

C lebih sesuai untuk senario di mana kawalan langsung sumber perkakasan dan pengoptimuman prestasi tinggi diperlukan, sementara Golang lebih sesuai untuk senario di mana pembangunan pesat dan pemprosesan konkurensi tinggi diperlukan. Kelebihan 1.C terletak pada ciri-ciri perkakasan dan keupayaan pengoptimuman yang tinggi, yang sesuai untuk keperluan berprestasi tinggi seperti pembangunan permainan. 2. Kelebihan Golang terletak pada sintaks ringkas dan sokongan konvensional semulajadi, yang sesuai untuk pembangunan perkhidmatan konvensional yang tinggi.

Golang vs Python: Perbezaan dan Persamaan Utama Golang vs Python: Perbezaan dan Persamaan Utama Apr 17, 2025 am 12:15 AM

Golang dan Python masing -masing mempunyai kelebihan mereka sendiri: Golang sesuai untuk prestasi tinggi dan pengaturcaraan serentak, sementara Python sesuai untuk sains data dan pembangunan web. Golang terkenal dengan model keserasiannya dan prestasi yang cekap, sementara Python terkenal dengan sintaks ringkas dan ekosistem perpustakaan yang kaya.

Impak Golang: Kelajuan, Kecekapan, dan Kesederhanaan Impak Golang: Kelajuan, Kecekapan, dan Kesederhanaan Apr 14, 2025 am 12:11 AM

Goimpactsdevelopmentpositivielythroughspeed, efficiency, andsimplicity.1) Speed: goCompilesquicklyandrunsefficiently, idealforlargeproject.2) Kecekapan: ITSComprehensivestandardlibraryraryrarexternaldependencies, enhingdevelyficiency.

Golang dan C: Perdagangan dalam prestasi Golang dan C: Perdagangan dalam prestasi Apr 17, 2025 am 12:18 AM

Perbezaan prestasi antara Golang dan C terutamanya ditunjukkan dalam pengurusan ingatan, pengoptimuman kompilasi dan kecekapan runtime. 1) Mekanisme pengumpulan sampah Golang adalah mudah tetapi boleh menjejaskan prestasi, 2) Pengurusan memori manual C dan pengoptimuman pengkompil lebih cekap dalam pengkomputeran rekursif.

See all articles