0

構造アラインメントは「実装固有」であることは理解していますが、構造アラインメントを計算する簡単な方法があるかどうか疑問に思っています。たとえば、次のようになります。

typedef struct
{
    char c;
    int  i;
} test;

if sizeof(test) - (sizeof(char) + sizeof(int)) == 0 means alignment is  1 byte;
if sizeof(test) - (sizeof(char) + sizeof(int)) == 1 means alignment is  2 bytes;
// ...etc...

上記の仮定は確かに正しいですか?

4

3 に答える 3

4

あなたの方法は、一般的なケースでは信頼できません: この構造体で試した場合:

typedef struct
{
    int i1;
    int i2;
} test;

結果としてゼロが返されますが、これはおそらくアライメントではありません。

ただし、機能する方法は次のとおりです。

#include <stddef.h>

struct dummy
{
    char x;
    test t;
};

size_t test_alignment = offsetof(struct dummy, t);
于 2009-08-31T00:36:04.357 に答える
1

そして、これが私がツールボックスに持っているマクロであり( cafの手法を使用して)、型の配置を取得します:

#define ALIGNMENT_OF(t) offsetof( struct { char x; t dummy; }, dummy)

したがって、次のような式を使用できます。

typedef struct
{
    char c;
    int  i;
} test;

size_t x = ALIGNMENT_OF( test);    // will likely set x = 4

特定のコンパイラが非標準の組み込み関数をサポートしている可能性があることに注意してください (たとえば、MSVC はある時点で__alignof()組み込み関数のサポートを開始しました)。私のヘッダーはALIGNMENT_OF()、それをサポートするコンパイラを検出した場合、その組み込みを使用することを定義します (ただし、組み込みが提供する利点は正直わかりません)。

于 2009-08-31T06:42:27.407 に答える
0

最初の正しい推測だけが必要な場合は、構造内の最大の非集計メンバーとネストされた構造の最大サイズを推移的に見つけます。

于 2009-08-31T00:35:27.510 に答える