结构的内存大小

问题描述 投票:0回答:1

我具有以下结构。

    typedef struct {
        int8_t     tmsi[4];        /**< TMSI value. */
        int8_t     ptmsi[4];       /**< PTMSI value. */
        int8_t     gprs_attach_status;
        int8_t     rplmn[3];               /**< PLMN info */
        uint32_t T3212_value;
        uint32_t T3312_value;
        uint8_t   cs_reject_cause;
        uint8_t   ps_reject_cause;
        int8_t     qos[28];  /** QoS  parameters for a PDP context. */
        int8_t     pdp_addr_len;
        int8_t     pdp_address[10];
        uint16_t apn_addr_len;   /**< APN address length. */
        int8_t     apn_address[20];   /**< APN address. */
    }nas_ftd_umts_nas_info_s_type_v01 ;

此结构的大小,不带填充应为83。但是在64位处理器上编译时,大小显示为84。编译器为pdp_address [10]分配了一个额外的字节。不确定为什么要分配此额外的字节。谁能让我知道原因吗?

我用以下代码检查了每个成员的偏移量:

#define OFFSETOF(TYPE, ELEMENT) ((size_t)&(((TYPE *)0)->ELEMENT)) 

    int main()
    {
        temp a; 
        test_ping_req_msg_v01 t;
        nas_ftd_umts_nas_info_s_type_v01 info;
        nas_ftd_umts_network_info_s_type_v01 lte;
        nas_umts_ftd_info_ind_msg_v01 ftd;
        cout << sizeof(info) << endl;
        cout << OFFSETOF(nas_ftd_umts_nas_info_s_type_v01, ptmsi) << endl;
        cout << OFFSETOF(nas_ftd_umts_nas_info_s_type_v01, gprs_attach_status) << endl;
        cout << OFFSETOF(nas_ftd_umts_nas_info_s_type_v01, rplmn) << endl;
        cout << OFFSETOF(nas_ftd_umts_nas_info_s_type_v01, T3212_value) << endl;
        cout << OFFSETOF(nas_ftd_umts_nas_info_s_type_v01, T3312_value) << endl;
        cout << OFFSETOF(nas_ftd_umts_nas_info_s_type_v01, cs_reject_cause) << endl;
        cout << OFFSETOF(nas_ftd_umts_nas_info_s_type_v01, ps_reject_cause) << endl;
        cout << OFFSETOF(nas_ftd_umts_nas_info_s_type_v01, qos) << endl;
        cout << OFFSETOF(nas_ftd_umts_nas_info_s_type_v01, pdp_addr_len) << endl;
        cout << OFFSETOF(nas_ftd_umts_nas_info_s_type_v01, pdp_address) << endl;
        cout << OFFSETOF(nas_ftd_umts_nas_info_s_type_v01, apn_addr_len) << endl;
        cout << OFFSETOF(nas_ftd_umts_nas_info_s_type_v01, apn_address) << endl;
    }
output :

yamunarani@yamunarani:~$ ./a.out
84
4
8
9
12
16
20
21
22
50
51
62
64
c++ c
1个回答
2
投票

uint16_t的对齐要求是它从偶数地址开始。在不填充pdp_address[10]的情况下,您有61个字节(即奇数),直到apn_addr_len,因此编译器将pdp_address填充一个字节以将apn_addr_len放入偶数地址。

© www.soinside.com 2019 - 2024. All rights reserved.