【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/
http://blog.csdn.net/sky_qing/article/details/11650497/
【2017-07-01】Linux应用开发工程师面试问题记录之二:关于结构体的大小及内存对齐问题的更多相关文章
- 开发工程师面试的秘密( 整理自 Export C Programming )
开发工程师面试的秘密 因为打算转战linux平台,所以一直在配置自己喜欢的linux操作系统.同时在看那本<C 专家编程>,这本书主要是针对ANSI C 介绍的,所以和Linux(Unix ...
- 嵌入式系统Linux内核开发工程师必须掌握的三十道题(转)
嵌入式系统Linux内核开发工程师必须掌握的三十道题 如果你能正确回答以下问题并理解相关知识点原理,那么你就可以算得上是基本合格的Linux内核开发工程师,试试看! 1) Linux中主要有哪几种内核 ...
- Java高级开发工程师面试笔记
最近在复习面试相关的知识点,然后做笔记,后期(大概在2018.02.01)会分享给大家,尽自己最大的努力做到最好,还希望到时候大家能给予建议和补充 ----------------2018.03.05 ...
- 珍藏版 Python 开发工程师面试试题
珍藏版 Python 开发工程师面试试题 说明:不拿到几家公司的offer,那就是卑鄙的浪费 一.Python_基础语法 1.可变与不可变类型: 2.浅拷贝与深拷贝的实现方式.区别:deepcopy如 ...
- 大厂0距离:网易 Linux 运维工程师面试真题,内含答案
作为 Linux 运维工程师,进入大公司是开启职业新起点的关键,今天马哥 linux 运维及云计算智囊团的小伙伴特别分享了其在网易面试 Linux 运维及云计算工程师的题目和经历,希望对广大 Linu ...
- 嵌入式Linux内核开发工程师必须掌握的三十道题
如果你能正确回答以下问题并理解相关知识点原理,那么你就可以算得上是基本合格的Linux内核开发工程师. 1. Linux中主要有哪几种内核锁?(进程同步与互斥) (1)自旋锁:非睡眠锁 (2)信号量: ...
- Linux中的两个经典宏定义:获取结构体成员地址,根据成员地址获得结构体地址;Linux中双向链表的经典实现。
倘若你查看过Linux Kernel的源码,那么你对 offsetof 和 container_of 这两个宏应该不陌生.这两个宏最初是极客写出的,后来在Linux内核中被推广使用. 1. offse ...
- JAVA开发工程师面试(1)
我已经有很长一段时间没有更新博客了,难道是博主我变懒惰了吗?哎,这样可不行啊,我还有好多知识要学习,要和大家分享.以后我需要更加努力,改掉自己的惰性.本人文采不怎么样,只能是把自己所想的说出来,想和大 ...
- Linux运维工程师面试
一.Linux操作系统知识 1.常见的Linux发行版本都有什么?你最擅长哪一个?它的官网网站是什么?说明你擅长哪一块? 2.Linux开机启动流程详细步骤是什么?系统安装完,忘记密码如何破解? ...
随机推荐
- P5123 [USACO18DEC]Cowpatibility(容斥)
Luogu5123 计算[两组数中有相同的]=\(\sum_{i}\)两组数中\(i\)个数相同的组合方案 map <string,int> 操作\(:\)加上\(,\)防止算重 #inc ...
- DJ 算法的队列优先优化
DJ算法就是求单源最短路的算法,但是时间复杂度不太理想,所以在此献上用最小堆来优化的算法. 如果不懂优先队列可以先去看STL分类关于优先队列的介绍: ///POJ 2387为例 #include< ...
- Windows10下设置Shift+右键增加cmd
https://blog.csdn.net/wyx0712/article/details/82120806
- 事物及exec
事物3要出不多讲: 1.BEGIN TRANSACTION--开启事务 2.COMMIT TRANSACTION--事务执行 3.ROLLBACK TRANSACTION--事务回滚 俩总捕捉事物的方 ...
- vue 中的 ... (三个点的用法)
这个是扩展运算符. 扩展语法.对数组和对象而言,就是将运算符后面的变量里东西每一项拆下来.这个东西可以在函数定义的地方使用,比如使用func(...args)将函数传入的参数都放到args数组里.
- 2.1 GO 变量定义
GO有四种数据类型,数字.布尔.字符.派生类型:这里使用前三种简单类型来说明变量的定义与使用 package main import "fmt" var ( aa = 1 bb = ...
- Office 2016 word无法粘贴(Ctrl + V)
最近下载了一个 Office 2016 专业版 使用,发现 word 无法使用 Ctrl + V 粘贴东西,由于经常需要复制粘贴东西,无法粘贴影响很大 查了很多资料,尝试过很多的方法,终于发现问题的所 ...
- android Window(一)从setConetView说起
Activity的源码 首先从setContentView这里调用的mWindow的 setConetView() private Window mWindow; public void setCon ...
- Keepalived & Lvs集群搭建实验
实验拓扑图: 实验原理: Keepalived 是基于 LVS ,并与 LVS 高度融合的 LVS和keepalived的关系:lvs起的是负载均衡功能,而keepalived则是高可用(热 备)的支 ...
- mac 下安装 mysql
1. 下载mysql community server 2. 下载mysql workbench 3. 启动mysql server 4. 进入mysql命令行 5. 修改root密码 ALTER U ...