0

したがって、以下のようなデータ型が混在する構造体があり、sizeof(struct a) が x32 および x64 のワード サイズの倍数であることを確認したいと考えています。どうやってやるの?ありがとうございました。

struct a {
    vaddr_t v1;
    size_t v2;
    unsigned short v3; 
    struct b* v4; 
    struct a *v5;
    int v6;
    pthread_mutex_t lock;
};
4

2 に答える 2

1

intsやshortsなどの基本的なタイプでは、intまたはshortの代わりにint32またはint16を明示的に使用することでこれを実現できます。size_tやポインタのような他のタイプの場合、それはより複雑になります。最善の策は、型属性を使用することです(http://gcc.gnu.org/onlinedocs/gcc-3.2/gcc/Type-Attributes.html)。

重要なのがメモリ内の構造体の位置合わせだけである場合は、そのメンバーではなく、構造体自体を位置合わせします。

于 2013-03-15T23:58:15.743 に答える
0

私はここで私の快適ゾーンの少し外に出ているかもしれませんが、memalignと呼ばれるmallocにバリエーションがあるようです:

 void *memalign(size_t alignment, size_t size);

 The memalign() function allocates size bytes on a  specified
 alignment  boundary  and  returns a pointer to the allocated
 block. The value of the returned address is guaranteed to be
 an  even  multiple of alignment. The value of alignment must
 be a power of two and must be greater than or equal  to  the
 size of a word.

これはすべてのプラットフォームに存在する場合と存在しない場合がありますが、これは非常に一般的なようです。

int posix_memalign(void **memptr, size_t alignment, size_t size); 

で見られる:

http://pubs.opengroup.org/onlinepubs/009695399/functions/posix_memalign.html

ここで、ISO / JTC1 / SC22 / WG14 C、現在のISOC標準ISO/ IEC 9899:1990プログラミング言語の改訂に関する委員会の作業草案によって提案された固定幅型宣言のデータ型-C、(私はマンページで)クロスプラットフォームとクロスアーキテクチャが安定していることを読みました。

したがって、構造体メンバーの下位レベルを調べた場合、それらが整数のint32_tやuint32_tなどに基づいていることを願っています。次のようなPOSIXタイプがあります。

/*
 * POSIX Extensions
 */
typedef unsigned char   uchar_t;
typedef unsigned short  ushort_t;
typedef unsigned int    uint_t;
typedef unsigned long   ulong_t;

したがって、ここでは、これらの完全にクロスプラットフォームの安定したデータ型として定義された型のみを使用して構造体を構築することが可能であり、最終的には、コードをコンパイルする場所や方法に関係なく、構造体は常に同じサイズになると考えています。

覚えておいてください、私はここでストレッチをしていて、他の誰かが私の考えを明確にし、おそらく修正することを望んでいます。

于 2013-03-16T01:16:15.800 に答える