タグ付けされた質問 「memory-alignment」

8
メモリーアライメントの目的
確かにわかりません。あなたが1バイトの長さのメモリワードを持つメモリを持っているとしましょう。アライメントされたアドレスの場合のように、アライメントされていないアドレス(つまり、4で割り切れない)の単一メモリアクセスで4バイトの変数にアクセスできないのはなぜですか?

16
カスタムC ++アロケーターの説得力のある例?
std::allocatorカスタムソリューションを採用する理由は何ですか?正確性、パフォーマンス、スケーラビリティなどのために絶対に必要な状況に遭遇しましたか?本当に賢い例はありますか? カスタムアロケーターは、常に標準ライブラリの機能であり、あまり必要がありませんでした。ここのSOの誰かが彼らの存在を正当化するための説得力のある例を提供できるかどうか疑問に思っていました。

4
構造体の整列がフィールドタイプがプリミティブであるかユーザー定義であるかに依存するのはなぜですか?
で野田時間 v2では、我々はナノ秒の解像度に移動しています。つまり、関心のある時間の範囲全体を表すのに8バイト整数を使用できなくなったということです。そのため、野田時間の(多くの)構造体のメモリ使用量を調査するようになりました。 CLRの配置の決定におけるわずかな奇妙さを明らかにするため。 まず、これは実装の決定であり、デフォルトの動作はいつでも変更される可能性があることを理解しています。とを使用して変更できることを理解していますが、可能であればそれを必要としないソリューションを考え出します。[StructLayout][FieldOffset] 私の中心的なシナリオはstruct、参照タイプのフィールドと他の2つの値タイプのフィールドを含むaがあり、これらのフィールドがint。。私はそれが64ビットCLRで16バイトとして表されることを期待していましたが(参照用に8バイト、他のそれぞれに4バイト)、何らかの理由で24バイトを使用しています。ちなみに私は配列を使用してスペースを測定しています-レイアウトは状況によって異なる場合があることは理解していますが、これは妥当な出発点のように感じました。 これは問題を示すサンプルプログラムです: using System; using System.Runtime.InteropServices; #pragma warning disable 0169 struct Int32Wrapper { int x; } struct TwoInt32s { int x, y; } struct TwoInt32Wrappers { Int32Wrapper x, y; } struct RefAndTwoInt32s { string text; int x, y; } struct RefAndTwoInt32Wrappers { string text; Int32Wrapper x, …

4
スタック変数はGCCによって整列されていますか__attribute __((aligned(x)))?
私は次のコードを持っています: #include <stdio.h> int main(void) { float a[4] __attribute__((aligned(0x1000))) = {1.0, 2.0, 3.0, 4.0}; printf("%p %p %p %p\n", &a[0], &a[1], &a[2], &a[3]); } そして、私は次の出力を持っています: 0x7fffbfcd2da0 0x7fffbfcd2da4 0x7fffbfcd2da8 0x7fffbfcd2dac なぜの住所 a[0]の倍数ではないは0x1000ですか? 正確には __attribute__((aligned(x)))は何ですか?私はこの説明を誤解しましたか? gcc4.1.2を使用しています。

4
メモリアライメント:alignof / alignasの使い方は?
現在、共有メモリを使用しています。 わからないalignofとalignas。 cppreferenceが不明確です:alignof「alignment」を返しますが、「alignment」とは何ですか?次のブロックを整列させるために追加するバイト数?パッド入りサイズ?スタックオーバーフロー/ブログエントリも不明確です。 誰かが明確に説明できますalignofとalignas?

2
argcとargvのアドレスが12バイト離れているのはなぜですか?
私のコンピューター(Linuxを実行する64ビットIntel)で次のプログラムを実行しました。 #include <stdio.h> void test(int argc, char **argv) { printf("[test] Argc Pointer: %p\n", &argc); printf("[test] Argv Pointer: %p\n", &argv); } int main(int argc, char **argv) { printf("Argc Pointer: %p\n", &argc); printf("Argv Pointer: %p\n", &argv); printf("Size of &argc: %lu\n", sizeof (&argc)); printf("Size of &argv: %lu\n", sizeof (&argv)); test(argc, argv); return 0; …

1
std :: vectorがアライメントされたメモリを割り当てるための最新のアプローチ
次の質問には答えが古いしかし、関連、およびユーザーからのコメントされたマルク・Glisseは十分に議論されていない可能性があり、この問題に対する17 ++ C以来の新たなアプローチがあることを示唆しています。 すべてのデータにアクセスしながら、SIMDでアライメントされたメモリを適切に動作させようとしています。 Intelでは、タイプのfloatベクトルを作成し__m256、サイズを8分の1に削減すると、メモリが整列されます。 例えば std::vector<__m256> mvec_a((N*M)/8); 少しハックな方法で、ベクトル要素へのポインタを浮動小数点にキャストできます。これにより、個々の浮動小数点値にアクセスできます。 代わりに、私std::vector<float>はを正しく調整して、__m256segfaultingなしで他のSIMDタイプにロードできるようにしたいと思います。 私はaligned_allocを調べてきました。 これにより、正しく整列されたCスタイルの配列が得られます。 auto align_sz = static_cast<std::size_t> (32); float* marr_a = (float*)aligned_alloc(align_sz, N*M*sizeof(float)); ただし、これをどのように行うかわかりませんstd::vector<float>。のstd::vector<float>所有権を与えるmarr_a ことは可能ではないようです。 カスタムアロケーターを作成する必要があるという提案をいくつか見ましたが、これは多くの作業のように思われ、おそらく最新のC ++にはもっと良い方法がありますか?
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.