Cプログラミング記録

4093 ワード

バイト整列#pragma pack(n)とattribute((aligned(m))の違い:


前者は、コンパイラ構造体またはクラス内部のメンバー変数の第1の変数のアドレスに対するオフセット量の位置合わせを教え、デフォルトでは、コンパイラは自然境界に従って位置合わせされ、変数に必要な自然位置合わせ境界がnより大きい場合、nに従って位置合わせされ、そうでなければ自然境界に従って位置合わせされる.後者は、コンパイラが構造体またはクラス、または結合またはタイプの変数(オブジェクト)にアドレス空間を割り当てるときのアドレス位置合わせ方法を教える.すなわち、attribute((aligned(m))が1つのタイプに作用する場合、このタイプの変数は、アドレス空間を割り当てるときに、その格納されたアドレスが必ずmバイトで整列する(mは2のべき乗でなければならない).また、連続記憶空間を申請する際に、各要素のアドレスもmバイトで整列することを保証するために、その占有空間、すなわちサイズもmの整数倍である.attribute((aligned(m))は、単独の変数にも作用することができる.例:
#include<stdio.h>

#pragma pack(4)

typedef struct{

    uint32_t f1;

    uint8_t f2;

    uint8_t f3;

    uint32_t f4;

    uint64_t f5;

}__attribute__((aligned(1024))) ts;

int main()
{
    printf("Struct size is: %d, aligned on 1024
"
,sizeof(ts)); printf("Allocate f1 on address: 0x%x
"
,&(((ts*)0)->f1))
; printf("Allocate f2 on address: 0x%x
"
,&(((ts*)0)->f2))
; printf("Allocate f3 on address: 0x%x
"
,&(((ts*)0)->f3))
; printf("Allocate f4 on address: 0x%x
"
,&(((ts*)0)->f4))
; printf("Allocate f5 on address: 0x%x
"
,&(((ts*)0)->f5))
; return 0; }
 :

Struct size is: 1024, aligned on 1024 //__attribute__((aligned(1024)))  

Allocate f1 on address: 0x0

Allocate f2 on address: 0x4

Allocate f3 on address: 0x5

Allocate f4 on address: 0x8

Allocate f5 on address: 0xc

注意:緑の部分はattribute((aligned(1024))の役割を示す赤の部分説明#pragma pack(4)は、4より大きいサイズのメンバー変数のアドレスオフセットのみに対して、紫の部分説明は4より大きいサイズのメンバー変数に対して、そのアドレスオフセットは4バイトで整列する
参照:#pragma pack(n)とattribute((aligned(m))の違い

マクロ定義機能


c言語マクロ定義#defineの理解と資料整理

float

    1 u = (double)((rand()%4300543 + 35699457)/10000000);   
    2 u = (double)(rand()%4300543 + 35699457)/10000000;

1、(rand()%4300543+35699457)/1000000この生成は1つの整数型で、例えば3になって、それからdoubleに変わって、3.00000 2になって、正常に3.01451を生成することができます