zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    VScode+phpStudy搭建php代码调试环境
    bluekeep漏洞(CVE-2019-0708)利用
    bugku论剑场web解题记录
    upload-labs通关集
    攻防世界web新手区
    Vulnhub-XXE靶机学习
    Volatility取证使用笔记
    攻防世界WEB新手练习
    攻防世界MISC新手练习
    攻防世界CRYPTO新手练习
  • 原文地址:https://www.cnblogs.com/bodong/p/5989297.html
Copyright © 2011-2022 走看看