• 【2017-07-01】Linux应用开发工程师面试问题记录之二:关于结构体的大小及内存对齐问题


    Tencent后台服务器开发有一道题是计算一个结构体的sizeof的大小:

    struct strData

    {

     int m_Int;

    char m_Char;

    short m_Short;

    char m_Flag;

    }

    系统为32位的Unix机器,请问sizeof(strData)的值是多少?

    在32位系统中,int类型为4个字节,char类型为1个字节,short为2个字节,所以理论上上述结构体占用的空间总共为8个字节;

    但是,内存存放数据时如果各种类型合理对齐时,cpu访问数据的效率就比较高;比如某些平台上每次读取数据都是从偶地址开始,如果数据字节对齐的话,可能只需要一个cpu周期就可以取得数据。

    因此,假设存储地址从0x0000开始,则上述结构体中,m_Int是0-3,m_Char是4,m_short是6-7,m_Flag是8,共9个字节,鉴于4字节对齐,所以还需要额外的3字节,因此sizeof此结构体的大小为12个字节。

    如果改成

    struct strData

    {

    short m_Short;

    char m_Char;

    char m_Flag;

     int m_Int;

    }

    这样的话就是8个字节了。

    注意一定是偶数地址对齐,而且整个结构体的大小也必须是结构体最大对齐值的整数倍。

    当然了,如果是单字节对齐就是理想的内存占用。

    这也算是最基本的问题了,如果这也答错了,那被鄙视也是应该的了。

    希望能知耻而后勇。

    参考链接:

    为什么需要字节对齐?

    http://blog.csdn.net/zkf11387/article/details/7662450

    详解结构体、类等内存字节对齐

    http://zhangyu.blog.51cto.com/197148/673792/

    32位与64位下各类型长度对比

    http://blog.csdn.net/sky_qing/article/details/11650497/

  • 相关阅读:
    第一周作业
    模拟赛3 题解
    模拟赛2 题解
    [HNOI2008]GT考试 题解
    NOI Online 提高组 题解
    模拟赛1 题解
    知识点拾遗
    [NOIp2012]疫情控制 题解
    [CEOI2002]Bugs Integrated, Inc. 题解
    [NOIp2017]宝藏 题解
  • 原文地址:https://www.cnblogs.com/dengwenwu/p/7102987.html
Copyright © 2020-2023  润新知