問題タブ [struct-member-alignment]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - クラスを継承元のクラスに合わせますか? すべてのスタックの配置を強制しますか? サイズを変更しますか?
それを継承するオブジェクトの配置を指示する基本クラスが必要です。これは、ヒープの割り当て方法と、カスタム配列テンプレートでの配列の割り当て方法を制御できるため、ヒープに対しては正常に機能します。ただし、C++ に関する限り、クラスの実際のサイズはまったく変わりません。つまり、派生クラスのポインターでポインター演算を実行すると、間違った場所にスキップします。それが問題の1つです。
問題 2 は、スタックの配置です。スタック全体を 16 バイトでアラインされたポインターに直接強制する方法はないようです。
これらに影響を与える唯一のことは、vc++ および g++ コンパイラ固有の設定ですが、ここでの問題は、アライメントを常に手動で修正する必要がないことです。それは、苦痛は言うまでもなく、エラーが発生しやすいに違いありません。
ある種のスマート ポインターを作成することもできますが、それによってさらに多くの問題が発生します。
基本クラスだけを揃えると、子クラスも揃えられますか? もしそうなら、それは私の問題のほとんどを解決するでしょうが、そうであるとは思えません (私はこれを試してみます)。
windows - GCC と clang での MSVC /Zp の代替とは何ですか?
場合によっては、Windows 上の cl の/Zpなどのコンパイラ フラグを使用して、モジュール レベルで構造の配置を定義したいと考えています。GCC と clang の代替手段は何ですか?
c - C プログラム - 構造体変数のデータのパッキングと整列
32 ビット マシン (GCC を使用) でのプログラムの出力はどうなりますか? 説明。
出力が表示されます
4、4。
上記のプログラムは、構造体メンバーのアラインメントのパディングとデータのパッキングに関連していますか?
c - 構造アライメントの安全な使用
私は、構造体の次の使用が行われている会社で初めてです。
アラインメントとパディングについていくつかのことを知っており、コンパイラ (ARM9 デバイスの場合は gnu C99) がパディングを追加して、構造体をアラインさせると想定しています。
しかし、このコードは安全ですか? 私が理解しているように、他の構造体メンバーに関係なく、変数の直後に変数が続く
限り安全です。uint16 len
int8 array[]
uint16 の前のサイズが奇数の場合にのみ、パディングを追加しますか?
この使い方は正しいですか?さらに重要なことに、それは安全ですか?
c - この配置属性を typedef で指定する必要があるのはなぜですか?
私はもともとタブレットからこの質問を書き、多くのショートカットを使用したため、最終的に質問を読んだり、質問に答えようとしたりする人々に混乱を招くと思います.
私が最初に抱えていた問題の解決策を求めているわけではありません。裏話が本当に必要な場合は次の段落を読み、それ以外の場合はスキップしてください。
{struct, data, struct, data, ...}
これを引き起こしたのは、それぞれdata
が任意の長さを持つ形式のデータの配列を操作する古いコードです。コードはポインターを介して各構造体にアクセスし、gcc に切り替えたときに、Solaris でミスアライン アクセスが原因でクラッシュし始めました。これを解決するための 1 つのアイデアは、以下に示すように型のアラインメントを変更することでしたが、私はおそらくそうするつもりはありません。
回答すべき質問は次のように要約できます。
- ドキュメントには、アラインメントを で減らすことはできないと記載さ
aligned
れていますが、typedef で行うことができます。意図したとおりに機能していますか? - 意図したとおりに機能している場合、なぜ typedef が必要なのですか? 構造体定義の一部としてアラインメントを下げることができないのはなぜですか?
- 注:それ
typedef struct {...}__attribute__((aligned(1))) Typename;
も同様に行うことができます
- 注:それ
wandbox で実行されているサンプル コードへのリンクを次に示します。リンクが切れた場合:
c - char フィールドのみを持つ sizeof c 構造体
パディングの仕組みを理解しています。アラインメントとは何かを知っています。私にとって奇妙なのは、char フィールドのみを持つ構造体のサイズが 4 バイトに整列されていない (末尾にパディングがある) ことです。これは単に仕様で保証されていないと思われるため、コンパイラはそれを行いません。その場合、そのようなルールへの参照を取得できますか? 主に x86 および x86-64 アーキテクチャに興味があります。
例:
出力:sizeof=3