0

編集:これは私の作業プロジェクトからのものです。働く。.cppファイルの先頭(#include部分の前でも)でいくつかのchar配列を宣言しました。次に、これらの配列を「16バイトに整列された変数の命令」で使用できます。

質問:この.cppファイルを別の.cppファイルでインクルードとして使用するとどうなりますか?その配列を別のプロジェクトの整列操作にも使用できますか?

質問2:これに対する近道はありますか?すべての変数を最初に配置したくありません。

いくつかのコード:(私はいくつかの16バイト整列配列で作業しました)

    //I put these arrays at the beginning, so they are aligned
//for the movaps instructions(x2 speed for reading and writing memory)
float v1[16];
float v2[16];
char counters[32];
char array_of_ones[32];
char source_array[4096];
char destination_array[4096];   
struct bit_field
{
    bf1:32; 
    bf2:32;
    bf3:32;
    bf4:32;
}some_area;
struct bit_mask_x
{
    bf1:32;
    bf2:32;
    bf3:32;
    bf4:32;
}some_mask;
float var_fast[16];
char alignment_purge[5];    //for the unalignment tests
char unaligned_source_array[4096];
char unaligned_destination_array[4096];



#include <math.h>
#include<stdlib.h>
#include<stdio.h>
#include<time.h>
.....
.....

このプログラムを次のような別のプログラムに含めるとどうなりますか?

#include <math.h>
#include<my_aligned.h> <-------- or my_aligned.cpp
#include<stdio.h>
#include<time.h>

これには.hファイルを使用する必要がありますか?

ありがとう...

4

2 に答える 2

1

これが変数を正しく整列させるかどうかを実際に試しましたか?コンパイルするとき、実行可能ファイルには常に16の倍数ではないサイズのヘッダーがあります。また、alignment_purgeコンパイラーがパディングを追加する可能性があるため、それに続く変数が実際には整列していない可能性があります。最後に、ヘッダーは変数を導入しないため、変数をヘッダーの上または下に配置しても、何も変更されません。

この質問を見て、整列されたメモリを要求する方法を確認できます。

ちなみに、通常、ソースファイルを別のファイルに含めたくないでしょう。このテーマに関するこの質問を参照してください。

于 2012-07-25T08:53:05.910 に答える
0

ファイルの先頭に変数宣言を配置することは、特定の配置を強制するために必要ではありません。ここで運が良かっただけかもしれませんし、コンパイラの特異性かもしれません。

gccを使用している場合は、aligned 属性を使用して、正しいアライメントを要求できます。他のコンパイラーには、おそらく同等の拡張子または#PRAGMAsがあります。

例えば。gccの拡張子を持つ変数宣言は次のようになります。

float v1[16] __attribute__ ((aligned (16)));
float v2[16] __attribute__ ((aligned (16)));

完全に移植可能である必要がある場合、唯一の解決策は、メモリの大きなブロックを動的に割り当ててから、割り当てられたブロックの配置を自分で管理することだと思います。


アライメントは、変数が実際に.cppファイルに格納されている場所でのみ適用する必要があることに注意してください。ヘッダーでそれらを前方宣言するだけで、他のファイルでそれらを参照できるようになります。 #include.cppファイルを作成する必要がないだけでなく、すべてのファイルに同じ名前の変数の独自のコピーがあるため、リンクエラーが発生します。


OPはデジタルマーズを使用しています(これについてすぐに言及した場合、私はそれを調べたでしょう)。

デジタル火星の配置を検索すると、最初のヒットはプラグマのドキュメントです。私は最初に整列を見ました、そしてそれは私にパックを紹介しました。

これを使用すると、コードは次のようになります。

#pragma pack(push, 16)
float v1[16];
float v2[16];
// ... any other aligned variables defined here
#pragma pack(pop)

ただし、パックは構造内のメンバーの配置に影響します。グローバル変数に対してパックが何をするかは明確ではありません。

確かに、整列されたアロケータを作成する必要があると思います。たとえば、_aligned割り当てC ++ `を検索することから始め、理解できない場合は専用の質問を投稿します。

于 2012-07-25T08:52:10.137 に答える