C++结构体内存对齐跨平台测试

测试1,不规则对齐数据。

Code:

#include <stdio.h>

#pragma pack(push)
#pragma pack(8)
struct Test8
{
    char a;
    long long b;
    char d;
};
#pragma pack(pop)

#pragma pack(push)
#pragma pack(4)
struct Test4
{
    char a;
    long long b;
    char d;
};
#pragma pack(pop)

#pragma pack(push)
#pragma pack(1)
struct Test1
{
    char a;
    long long b;
    char d;
};
#pragma pack(pop)

struct Test0
{
    char a;
    long long b;
    char d;
};

int main()
{
    printf("sizeof(void*)=%d\n", sizeof(void*));
    printf("sizeof(long long)=%d\n", sizeof(long long));
    printf("sizeof(Test8)=%d\n", sizeof(struct Test8));
    printf("sizeof(Tes4)=%d\n", sizeof(struct Test4));
    printf( "sizeof(Test1)=%d\n", sizeof(struct Test1));
    printf("sizeof(Test0)=%d\n", sizeof(struct Test0));
    
    return 0;
}

Output msvc x86:

sizeof(void*)=4
sizeof(long long)=8
sizeof(Test8)=24
sizeof(Tes4)=16
sizeof(Test1)=10
sizeof(Test0)=24

Output msvc x64:

sizeof(void*)=8
sizeof(long long)=8
sizeof(Test8)=24
sizeof(Tes4)=16
sizeof(Test1)=10
sizeof(Test0)=24

Output xcode IOS armV7:

sizeof(void*)=4
sizeof(long long)=8
sizeof(Test8)=16
sizeof(Tes4)=16
sizeof(Test1)=10
sizeof(Test0)=16

Output xcode IOS arm64:

sizeof(void*)=8
sizeof(long long)=8
sizeof(Test8)=24
sizeof(Tes4)=16
sizeof(Test1)=10
sizeof(Test0)=24

Android armv7 simulator output code:

    __android_log_print(ANDROID_LOG_DEBUG, "JNITag", "sizeof(void*)=%d\n", sizeof(void*));
    __android_log_print(ANDROID_LOG_DEBUG, "JNITag", "sizeof(long long)=%d\n", sizeof(long long));
    __android_log_print(ANDROID_LOG_DEBUG, "JNITag", "sizeof(Test8)=%d\n", sizeof(Test8));
    __android_log_print(ANDROID_LOG_DEBUG, "JNITag", "sizeof(Tes4)=%d\n", sizeof(Test4));
    __android_log_print(ANDROID_LOG_DEBUG, "JNITag", "sizeof(Test1)=%d\n", sizeof(Test1));
    __android_log_print(ANDROID_LOG_DEBUG, "JNITag", "sizeof(Test0)=%d\n", sizeof(Test0));

Android armv7 simulator Output:

D/JNITag: sizeof(void*)=4
D/JNITag: sizeof(long long)=8
D/JNITag: sizeof(Test8)=16
D/JNITag: sizeof(Tes4)=16
D/JNITag: sizeof(Test1)=10
D/JNITag: sizeof(Test0)=16

测试二,简单数组测试,源码:

#include <stdio.h>

#pragma pack(push)
#pragma pack(8)
struct Test8
{
    char a[3];
};
#pragma pack(pop)

#pragma pack(push)
#pragma pack(4)
struct Test4
{
    char a[3];
};
#pragma pack(pop)

#pragma pack(push)
#pragma pack(1)
struct Test1
{
    char a[3];
};
#pragma pack(pop)

struct Test0
{
    char a[3];
};

int main()
{
    printf("sizeof(void*)=%d\n", sizeof(void*));
    printf("sizeof(long long)=%d\n", sizeof(long long));
    printf("sizeof(Test8)=%d\n", sizeof(struct Test8));
    printf("sizeof(Tes4)=%d\n", sizeof(struct Test4));
    printf( "sizeof(Test1)=%d\n", sizeof(struct Test1));
    printf("sizeof(Test0)=%d\n", sizeof(struct Test0));
    
    return 0;
}

msvc x86:

sizeof(void*)=4
sizeof(long long)=8
sizeof(Test8)=3
sizeof(Tes4)=3
sizeof(Test1)=3
sizeof(Test0)=3

msvc x64:

sizeof(void*)=8
sizeof(long long)=8
sizeof(Test8)=3
sizeof(Tes4)=3
sizeof(Test1)=3
sizeof(Test1)=3

iphone armv7:

sizeof(void*)=4
sizeof(long long)=8
sizeof(Test8)=3
sizeof(Tes4)=3
sizeof(Test1)=3
sizeof(Test0)=3

iphone arm64:

sizeof(void*)=8
sizeof(long long)=8
sizeof(Test8)=3
sizeof(Tes4)=3
sizeof(Test1)=3
sizeof(Test0)=3

android armv7 simulator:

D/JNITag: sizeof(void*)=4
D/JNITag: sizeof(long long)=8
D/JNITag: sizeof(Test8)=3
D/JNITag: sizeof(Tes4)=3
D/JNITag: sizeof(Test1)=3
D/JNITag: sizeof(Test0)=3

测试三,当结构体包含pack1的结构体时

code:

#include <stdio.h>
#include <stddef.h>

#pragma pack(push)
#pragma pack(1)
struct Test1
{
    char a[3];
    long long b;
    char d[2];
    int e;
};
#pragma pack(pop)

#pragma pack(push)
#pragma pack(8)
struct Owner8
{
    char c1;
    struct Test1 a;
    int i2;
};

#pragma pack(pop)

#pragma pack(push)
#pragma pack(4)
struct Owner4
{
    char c1;
    struct Test1 a;
    int i2;
};

#pragma pack(pop)

#pragma pack(push)
#pragma pack(1)
struct Owner1
{
    char c1;
    struct Test1 a;
    int i2;
};

#pragma pack(pop)

struct Owner0
{
    char c1;
    struct Test1 a;
    int i2;
};

int main()
{
    printf("sizeof(void*)=%d\n", sizeof(void*));
    printf("sizeof(long long)=%d\n", sizeof(long long));
    printf( "sizeof(Test1)=%d\n", sizeof(struct Test1));
    
    printf("---------------------------------------\n");
    printf("sizeof(Owner8)=%d\n", sizeof(struct Owner8));
    printf("offsetof(Owner8, a)=%d\n", offsetof( struct Owner8, a));
    printf("offsetof(Owner8, i2)=%d\n", offsetof( struct Owner8, i2));

    printf("---------------------------------------\n");
    printf("sizeof(Owner4)=%d\n", sizeof(struct Owner4));
    printf("offsetof(Owner4, a)=%d\n", offsetof( struct Owner4, a));
    printf("offsetof(Owner4, i2)=%d\n", offsetof( struct Owner4, i2));

    printf("---------------------------------------\n");
    printf("sizeof(Owner1)=%d\n", sizeof(struct Owner1));
    printf("offsetof(Owner1, a)=%d\n", offsetof( struct Owner1, a));
    printf("offsetof(Owner1, i2)=%d\n", offsetof( struct Owner1, i2));

    printf("---------------------------------------\n");
    printf("sizeof(Owner0)=%d\n", sizeof(struct Owner0));
    printf("offsetof(Owner0, a)=%d\n", offsetof( struct Owner0, a));
    printf("offsetof(Owner0, i2)=%d\n", offsetof( struct Owner0, i2));
    
    return 0;
}

msvc x86:

sizeof(void*)=4
sizeof(long long)=8
sizeof(Test1)=17
---------------------------------------
sizeof(Owner8)=24
offsetof(Owner8, a)=1
offsetof(Owner8, i2)=20
---------------------------------------
sizeof(Owner4)=24
offsetof(Owner4, a)=1
offsetof(Owner4, i2)=20
---------------------------------------
sizeof(Owner1)=22
offsetof(Owner1, a)=1
offsetof(Owner1, i2)=18
---------------------------------------
sizeof(Owner0)=24
offsetof(Owner0, a)=1
offsetof(Owner0, i2)=20

msvc x64:

sizeof(void*)=8
sizeof(long long)=8
sizeof(Test1)=17
---------------------------------------
sizeof(Owner8)=24
offsetof(Owner8, a)=1
offsetof(Owner8, i2)=20
---------------------------------------
sizeof(Owner4)=24
offsetof(Owner4, a)=1
offsetof(Owner4, i2)=20
---------------------------------------
sizeof(Owner1)=22
offsetof(Owner1, a)=1
offsetof(Owner1, i2)=18
---------------------------------------
sizeof(Owner0)=24
offsetof(Owner0, a)=1
offsetof(Owner0, i2)=20

xcode ios armv7:

sizeof(void*)=4
sizeof(long long)=8
sizeof(Test1)=17
---------------------------------------
sizeof(Owner8)=24
offsetof(Owner8, a)=1
offsetof(Owner8, i2)=20
---------------------------------------
sizeof(Owner4)=24
offsetof(Owner4, a)=1
offsetof(Owner4, i2)=20
---------------------------------------
sizeof(Owner1)=22
offsetof(Owner1, a)=1
offsetof(Owner1, i2)=18
---------------------------------------
sizeof(Owner0)=24
offsetof(Owner0, a)=1
offsetof(Owner0, i2)=20

xcode ios arm64:

sizeof(void*)=8
sizeof(long long)=8
sizeof(Test1)=17
---------------------------------------
sizeof(Owner8)=24
offsetof(Owner8, a)=1
offsetof(Owner8, i2)=20
---------------------------------------
sizeof(Owner4)=24
offsetof(Owner4, a)=1
offsetof(Owner4, i2)=20
---------------------------------------
sizeof(Owner1)=22
offsetof(Owner1, a)=1
offsetof(Owner1, i2)=18
---------------------------------------
sizeof(Owner0)=24
offsetof(Owner0, a)=1
offsetof(Owner0, i2)=20

android armv7 simulator:

D/JNITag: sizeof(void*)=4
D/JNITag: sizeof(long long)=8
D/JNITag: sizeof(Test1)=17
D/JNITag: ---------------------------------------
D/JNITag: sizeof(Owner8)=24
D/JNITag: offsetof(Owner8, a)=1
D/JNITag: offsetof(Owner8, i2)=20
D/JNITag: ---------------------------------------
D/JNITag: sizeof(Owner4)=24
D/JNITag: offsetof(Owner4, a)=1
D/JNITag: offsetof(Owner4, i2)=20
D/JNITag: ---------------------------------------
D/JNITag: sizeof(Owner1)=22
D/JNITag: offsetof(Owner1, a)=1
D/JNITag: offsetof(Owner1, i2)=18
D/JNITag: ---------------------------------------
D/JNITag: sizeof(Owner0)=24
D/JNITag: offsetof(Owner0, a)=1
D/JNITag: offsetof(Owner0, i2)=20
原文地址:https://www.cnblogs.com/bodong/p/5989297.html