ホームページ バックエンド開発 Golang C 構造体のレイアウトの最適化

C 構造体のレイアウトの最適化

Jan 03, 2025 pm 01:57 PM

簡単な C 構造体を考えてみましょう:

struct foo {
    const char * str;
    unsigned char flag;
    uint64_t len;
};
ログイン後にコピー
ログイン後にコピー

このコードが 64 ビット マシンで実行されるプログラムの一部として実行されていると仮定します。sizeof(struct foo) の結果はどうなるでしょうか?

構造体のサイズや最適化をいじる必要がなかったほとんどの人は、それが 17 であるべきだと推測するでしょう...

...でも もう 24 時です!それはなぜですか?

この動作の理由は、コンパイラが速度向上のために構造体のレイアウトを最適化しており、整列されたメモリ アクセスがデータにアクセスする最速の方法であるという現代の標準であるためです。

これは、フィールドと CPU のタイプに応じて、データに何らかのアライメントがあり、そのアライメントが尊重されるように (または、field-address % field-alignment == 0 になるように) 配置されることを意味します。

サイズ、配置、パディング

前の例の場合、ポインタと 64 ビット フィールドは 64 ビット マシン上で 8B にアライメントされています。これは、構造体のすべてがアライメントされるレイアウトを強制するために、コンパイラがいくつかのflag フィールドと len フィールドの間のパディング:

optimizing c structs layouts

次に、前と同じマシン上で次のような構造体が定義されている別の例を考えてみましょう。

struct bar {
    const char * str;
    short s1;
    int i1
    short s2;
    int i2;
};
ログイン後にコピー
ログイン後にコピー

そのサイズを計算するにはどうすればよいですか?

3 つのルールがあります:

  • 構造体フィールドは、独自の自然な配置に合わせて配置する必要があります。
  • 構造体全体のアライメントは、その最も広いフィールドのアライメントと同じです
  • 同じ型の 2 つの構造体を並べて配置する必要がある場合、2 番目の構造体はその配置に合わせて配置する必要があります。これは、構造体にはその配置まで末尾のパディングが必要であることを意味します

64 ビット マシンの基本的な型の配置とサイズの簡単な要約:

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

次の点にも注意してください:

  • 配列には値の型とサイズ (sizeof(type) * 要素数) のアラインメントがあります。
  • 共用体には、最も広いメンバーの位置合わせとサイズがあります。

また、非常に便利な sizeof 演算子と _Alignof 演算子を使用して、カスタム タイプの情報を取得できます。 _Alignof は C11 以降で使用可能であり、C23 以降は alignof と呼ばれることに注意してください。 C 11 以降、私が C で理解していることによれば、それは常に alignof でした。

詳細については、このトピックのバイブルは『The Lost Art of Structure Packing』です。私はこの本について、私が知っているほぼすべてのことを、多くの実践と実践経験とともに学びました。

構造体の最適化: stropt

ここでのこのトピックは、職場でかなり頻繁に取り上げられるもので、大量のデータをキューなどで継続的に送信するときに、あちこちでバイトを節約することが非常に重要です。

作業を楽にするために、ソース ファイルまたはコード スニペットを参照して、入力として渡された型に関する統計を生成するツールを作成しました。stropt (構造体オプティマイザー).

Abathargh/stropt on GitHub

構築とインストール

ローカルに go がインストールされている場合は、すぐに進んでアプリケーションを直接ビルドまたはインストールできます。

struct foo {
    const char * str;
    unsigned char flag;
    uint64_t len;
};
ログイン後にコピー
ログイン後にコピー

OS/アーキテクチャの組み合わせのリスト用にコンパイル済みのバイナリも、github リリース ページで提供されています。

stropt バイナリ

ツールを使って

分析するソースを文字列として渡すことで、stropt を使用できます。

struct bar {
    const char * str;
    short s1;
    int i1
    short s2;
    int i2;
};
ログイン後にコピー
ログイン後にコピー

optimizing c structs layouts

または、定義が含まれるファイルを渡すこともできます:

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

// or, if you want to install this directly
go install github.com/Abathargh/stropt
ログイン後にコピー

optimizing c structs layouts

このツールは、-optimize フラグを使用して型の最適化を行うこともでき、構造体自体であるフィールドを認識します。

optimizing c structs layouts

冗長フラグは、内部構造体 (および共用体) をフィールドの配置とサイズとともに表示するために使用されることに注意してください。

次は何ですか

このツールは、C コードの解析に優れた modernc.org/cc C コンパイラー フロントエンドを使用し、UI に Charmbracelet のリップグロスを使用して Go で作成されました。

これは自分用に書いていますが、喜んで公開します。これをブラウザで直接簡単に使えるように Web アプリにしたいので、おそらく次の作業はこれになると思います!

以上がC 構造体のレイアウトの最適化の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Golangの目的:効率的でスケーラブルなシステムの構築 Golangの目的:効率的でスケーラブルなシステムの構築 Apr 09, 2025 pm 05:17 PM

GO言語は、効率的でスケーラブルなシステムの構築においてうまく機能します。その利点には次のものがあります。1。高性能:マシンコードにコンパイルされ、速度速度が速い。 2。同時プログラミング:ゴルチンとチャネルを介してマルチタスクを簡素化します。 3。シンプルさ:簡潔な構文、学習コストとメンテナンスコストの削減。 4。クロスプラットフォーム:クロスプラットフォームのコンパイル、簡単な展開をサポートします。

Golang and C:Concurrency vs. Raw Speed Golang and C:Concurrency vs. Raw Speed Apr 21, 2025 am 12:16 AM

Golangは並行性がCよりも優れていますが、Cは生の速度ではGolangよりも優れています。 1)Golangは、GoroutineとChannelを通じて効率的な並行性を達成します。これは、多数の同時タスクの処理に適しています。 2)Cコンパイラの最適化と標準ライブラリを介して、極端な最適化を必要とするアプリケーションに適したハードウェアに近い高性能を提供します。

パフォーマンスレース:ゴラン対c パフォーマンスレース:ゴラン対c Apr 16, 2025 am 12:07 AM

GolangとCにはそれぞれパフォーマンス競争において独自の利点があります。1)Golangは、高い並行性と迅速な発展に適しており、2)Cはより高いパフォーマンスと微細な制御を提供します。選択は、プロジェクトの要件とチームテクノロジースタックに基づいている必要があります。

Golang vs. Python:パフォーマンスとスケーラビリティ Golang vs. Python:パフォーマンスとスケーラビリティ Apr 19, 2025 am 12:18 AM

Golangは、パフォーマンスとスケーラビリティの点でPythonよりも優れています。 1)Golangのコンピレーションタイプの特性と効率的な並行性モデルにより、高い並行性シナリオでうまく機能します。 2)Pythonは解釈された言語として、ゆっくりと実行されますが、Cythonなどのツールを介してパフォーマンスを最適化できます。

CとGolang:パフォーマンスが重要な場合 CとGolang:パフォーマンスが重要な場合 Apr 13, 2025 am 12:11 AM

Cは、ハードウェアリソースと高性能の最適化が必要なシナリオにより適していますが、Golangは迅速な開発と高い並行性処理が必要なシナリオにより適しています。 1.Cの利点は、ハードウェア特性と高い最適化機能に近いものにあります。これは、ゲーム開発などの高性能ニーズに適しています。 2.Golangの利点は、その簡潔な構文と自然な並行性サポートにあり、これは高い並行性サービス開発に適しています。

Golang vs. Python:重要な違​​いと類似点 Golang vs. Python:重要な違​​いと類似点 Apr 17, 2025 am 12:15 AM

GolangとPythonにはそれぞれ独自の利点があります。Golangは高性能と同時プログラミングに適していますが、PythonはデータサイエンスとWeb開発に適しています。 Golangは同時性モデルと効率的なパフォーマンスで知られていますが、Pythonは簡潔な構文とリッチライブラリエコシステムで知られています。

Golangの影響:速度、効率、シンプルさ Golangの影響:速度、効率、シンプルさ Apr 14, 2025 am 12:11 AM

speed、効率、およびシンプル性をspeedsped.1)speed:gocompilesquilesquicklyandrunseffictient、理想的なlargeprojects.2)効率:等系dribribraryreducesexexternaldedenciess、開発効果を高める3)シンプルさ:

GolangとC:パフォーマンスのトレードオフ GolangとC:パフォーマンスのトレードオフ Apr 17, 2025 am 12:18 AM

GolangとCのパフォーマンスの違いは、主にメモリ管理、コンピレーションの最適化、ランタイム効率に反映されています。 1)Golangのゴミ収集メカニズムは便利ですが、パフォーマンスに影響を与える可能性があります。

See all articles