4

C++のコンパイラフラグについて助けが必要です。WindowsからLinuxへの移植であるライブラリを使用しています。このライブラリは、「Win32互換性のために」-malign-doubleフラグを使用してコンパイルする必要があります。これは、絶対にこのフラグを使用して自分のコードをコンパイルする必要があることを意味することを理解していますか?他の.so共有ライブラリはどうですか?それらもこのフラグで再コンパイルされていますか?もしそうなら、これを回避する方法はありますか?

私はLinux初心者(およびc ++)なので、プロジェクトに使用しているすべてのライブラリを再コンパイルしようとしても、すべてのライブラリとそれらが依存しているライブラリのソースを再帰的に見つけるには複雑すぎました。オンにして、すべてを再コンパイルします。

編集:答えてくれてありがとう。背景:このライブラリは、初期化とUSB接続カメラへのアクセスを制御します。問題は、このフラグがないと、奇妙なことが起こり始めることです。一見ランダムに、カメラの初期化が失敗し、USB接続エラーが発生します。また、スタック上にあるいくつかのc-string(const char *)のある種のメモリ破損が発生します。基本的に、このカメラの初期化を呼び出す前に、それらはディレクトリパスを指します。初期化後、文字列「me」を指します。私にとってどちらが非常に混乱しています。

4

3 に答える 3

4

それは素晴らしい旗の名前です!-悪性の影響もあるのだろうか?しかし、真剣にこのフラグはわずかな最適化を制御します:

-悪性-ダブル

-mno-align-double

GCCがdouble、long double、およびlong long変数を2ワード境界に揃えるか、1ワード境界に揃えるかを制御します.2ワード境界にdouble変数を揃えると、メモリを犠牲にして「Pentium」でいくらか高速に実行されるコードが生成されます。

ライブラリまたはコードのいずれかがこのフラグを必要とする可能性はほとんどありません。一般に、何をしているのかを正確に理解していない限り、アライメント制御フラグを使用しないでください。それらを使用する必要があると思われる場合は、GCCマニュアル(http://gcc.gnu.org/onlinedocs )を参照してください。

于 2010-03-16T19:01:08.760 に答える
2

通常、最新のコンパイラの配置設定を変更する必要はありません。コンパイラがアラインされていないものを格納する場合でも、プログラムは壊れません。

それが必要になる唯一の場所は、LinuxとWindowsバージョンのプログラムの間でバイナリで(ファイルまたはネットワークを介して)渡される構造です。しかし、これらの場合、の使用法pragma packはより良いスタイルです。

更新:ドライバーは、バイナリ構造が仕様とビットごとに等しいことも必要とします。

于 2010-03-16T19:02:41.387 に答える
0

かもしれない。そのコードがエントリ時にスタックが整列されることを期待していて、コードがそれを保証しない場合は、問題があります。ヒープに割り当てられたオブジェクトについても同じことが言えます。整列されるべきであるが整列されていないポインタを渡す場合、それも間違っています。

同時に、1つまたは2つの関数だけでいくつかの変数を整列させる必要がある可能性があり、結局のところ問題にはなりませんでした。自分が担当しているコードを理解するのに必要な時間が与えられればいいのですが、それは現実の世界ではそうではないと思います。

于 2010-03-16T19:04:42.197 に答える