2

私がC/C++構造体を持っていると仮定します

struct ABCTYPE
{
  double A;
  double B;
  double C;
};

どんな種類の最新のプラットフォームでも余分なパディングがないことが保証されていますか?

具体的には、

std::vector<ABCTYPE> storage;
// add some elements

// now i need some C routines to the data
double* param=&(storage[0]);
c_routine(param);  // Tested OK on Win/Linux, but will it work on any platforms?
4

4 に答える 4

4

このような構造体にパディングを付けることは技術的に可能です。1つのメンバーのみを含む構造体の単純な場合でも、パディングを含めることができます。

ラッパークラスのC++サイズ

于 2012-05-16T16:55:22.727 に答える
1

Visual C ++では#pragma pack、構造体のパディングを変更するために使用できます。値は8より大きく設定できますsizeof(double)。ドキュメントには、16に設定する例が示されています。

于 2012-05-16T17:00:03.180 に答える
0

あなたの特定の質問が行く限り、あなたstd::vectorが上で尋ねた同等性が有効であるかどうかへの答えはこのstackoverflow投稿で見つけることができます。

于 2012-05-16T17:18:40.427 に答える
0

理論的には可能です。実際には、それを見て少し驚いたでしょう(たとえば、タイプをからdoubleに変更した場合short、パディングはそれほど驚くことではなくなります)。

MS VCでは、#pragma pack(最大で)オブジェクトのサイズにのみ位置合わせされます。MSDNから:

n(オプション)

パッキングに使用される値をバイト単位で指定します。nのデフォルト値は8です。有効な値は1、2、4、8、および16です。メンバーの配置は、nの倍数またはメンバーのサイズの倍数のいずれかである境界上になります。小さいです。[強調追加]

これは、同じタイプの複数のメンバーを含む構造体の間にパディングが挿入されることは決してないことを意味します。挿入できるパディングの最小量ではなく、最大#pragma pack量を制御します。

于 2012-05-16T17:21:15.777 に答える