zoukankan      html  css  js  c++  java
  • 【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/

  • 相关阅读:
    leetcode--Populating Next Right Pointers in Each Node II
    leetcode—Populating Next Right Pointers in Each Node
    Pascal's Triangle II
    leetcode—pascal triangle
    leetcode—triangle
    October 23rd, 2017 Week 43rd Monday
    October 22nd, 2017 Week 43rd Sunday
    October 21st 2017 Week 42nd Saturday
    October 20th 2017 Week 42nd Friday
    October 19th 2017 Week 42nd Thursday
  • 原文地址:https://www.cnblogs.com/dengwenwu/p/7102987.html
Copyright © 2011-2022 走看看