1. C语言结构体数据对齐

转自:http://blog.csdn.net/tiany524/article/details/6295551

1.1 结构体数据对齐(没有#pragma pack()宏定义)

结构体对齐可以总结为三个基本原则

①数据成员对齐规则:

结构体的数据成员中,第一个成员从offset为0的地址开始,以后每一个成员存储的起始位置为该成员大小的整数倍(在win32中int为32bit也即4字节对齐)

②结构体作为成员:

如果一个结构体1作为另一个结构体2的数据成员,则在结构体2中结构体1要从1内部成员最大的整数倍地址开始存储。

③结构体的总大小(sizeof):

为该结构体内部最大基本类型的整数倍,不足的要补齐,而不是简单的所有成员的大小总和。

举例说明

1 struct A
2 {
3     short a;
4     short b;
5     short c;
6 }; 

sizeof(A)=6

1 struct B
2 {
3     long a;
4     short c;
5 }; 

sizeof(B)=8

它的内存分配为: a1 a2 a3 a4 , c1 c2 x x(a1为a的第一个字节,x为补齐字节,下同)

1 struct C
2 {
3     int a;
4     char b;
5     short c;
6 };

sizeof(C)=8

它的内存分配为: a1 a2 a3 a4, b1 x c1 c2(原则1)

1 struct D
2 {
3     char a;
4     int b;
5     short c;
6 };

sizeof(D)=12

内存分配为: a1 x x x, b1 b2 b3 b4, c1 c2 x x

1 struct E
2 {
3     int a;
4     double b;
5     short c;
6 };

sizeof(E)=24

内存分布a1 a2 a3 a4 x x x x, b1 b2 b3 b4 b5 b6 b7 b7, c1 c2 x x x x x x

1 struct F
2 {
3     char a,b;
4     int c;
5     double d;
6     short e;
7     E h;
8 };

sizeof(F)=48

内存分布

a1 b1 x x, c1 c2 c3 c4 , d1 d2 d3 d4 d5 d6 d7 d8, e1 e2 x x x x x x, A的分布

1.2 加入#pragma pack()宏定义)

1 #pragma pack(1)
2 struct E
3 {
4     int a;
5     double b;
6     short c;
7 };

sizeof(E)=14,为实际内存
VC对结构的存储的特殊处理确实提高CPU存储变量的速度,但是有时候也带来了一些麻烦,我们也可以屏蔽掉变量默认的对齐方式,自己可以设定变量的对齐方式。
VC 中提供了 #pragma pack(n) 来设定变量以n字节对齐方式(n一般取1、2、4、8、16)。n字节对齐就是说变量存放的起始地址的偏移量有两种情况:第一、如果n大于等于该变量所占用的字节数,那么偏移量必须满足默认的对齐方式,第二、如果n小于该变量的类型所占用的字节数,那么偏移量为n的倍数,不用满足默认的对齐方式。结构的总大小也有个约束条件,分下面两种情况:如果n大于所有成员变量类型所占用的字节数,那么结构的总大小必须为占用空间最大的变量占用的空间数的倍数; 否则必须为n的倍数。下面举例说明其用法。

1 #pragma pack(push) //保存对齐状态
2 #pragma pack(4)//设定为4字节对齐
3 struct test
4 {
5     char m1;
6     double m4;
7     int m3;
8 };
9 #pragma pack(pop)//恢复对齐状态 

以上结构的大小为16,下面分析其存储情况,首先为m1分配空间,其偏移量为0,满足我们自己设定的对齐方式(4字节对齐),m1占用1个字节。接着开始为 m4分配空间,这时其偏移量为1,需要补足3个字节,这样使偏移量满足为n=4的倍数(因为sizeof(double)大于n),m4占用8个字节。接着为m3分配空间,这时其偏移量为12,满足为4的倍数,m3占用4个字节。这时已经为所有成员变量分配了空间,共分配了16个字节,满足为n的倍数。如果把上面的#pragma pack(4)改为#pragma pack(16),那么我们可以得到结构的大小为24。

2. 约瑟夫环问题

http://baike.baidu.com/view/717633.htm

问题描述:n个人(编号0~(n-1)),从0开始报数,报到m-1的退出,剩下的人继续从0开始报数。求胜利者的编号。

我们知道第一个人(编号一定是(m-1)%n) 出列之后,剩下的n-1个人组成了一个新的约瑟夫环(以编号为k=m%n的人开始):

k k+1 k+2 ... n-2,n-1,0,1,2,... k-2

并且从k开始报0。

  现在我们把他们的编号做一下转换:

  k --> 0

  k+1 --> 1

  k+2 --> 2

  ...

  ...

  k-3 --> n-3

  k-2 --> n-2

变换后就完完全全成为了(n-1)个人报数的子问题,假如我们知道这个子问题的解:例如x是最终的胜利者,那么根据上面这个表把这个x变回去不刚好就是n个人情况的解吗?!!

  ∵ k=m%n;

  ∴ x' = x+k = x+ m%n ; 而 x+ m%n 可能大于n

  ∴ x'= (x+m%n)%n = (x+m)%n

  得到 x‘=(x+m)%n

令f表示i个人玩游戏报m退出最后胜利者的编号,最后的结果自然是f[n].

  递推公式:

  f[1]=0;

  f[i]=(f[i-1]+m)%i; (i>1)

3. 求出小于n的最大素数,并做时间复杂度优化

4. 不限长的数据运算问题,字符数组模拟大数

转载于:https://www.cnblogs.com/shenshanxiaoyao/archive/2012/09/08/2677094.html

2012.9华为软件开发面试题相关推荐

  1. c++软件开发面试旋极面试题_经典软件开发面试题:浏览器中输入一个网址后发生了什么?...

    经典软件开发面试题:浏览器中输入一个网址后发生了什么? ​ 大家好, 这一期呢,我们来谈一个经典的面试题.这种题目是在浏览器中输入一个网址以后, 会显示一个网页,这期间到底发生了什么? 答案要求说的越 ...

  2. c++软件开发面试旋极面试题_腾讯软件开发面试题(有详细解答)

    我大学的时候,就有些博客的习惯.今天翻回去看之前写的博客,觉得有些幼稚,也有些惊喜.比如17 年初写的腾讯软件开发面试题还挺多人阅读评论的,这是我意想不到的,今天也整理一下,发出来给大家看下. 1.已 ...

  3. Java软件开发面试题总结

    Java面试题总结 简介 一.Java基础模块 ① JDK.JRE和JVM的区别? ② ==和equals的区别是什么? ③ 两个对象的hashCode()相同,则equals()也一定为true,对 ...

  4. Android软件开发面试题,Android入门

    前言 首先声明,楼主不是什么大牛,没有多牛逼的技术,只是公司扩招团队,有幸作为技术面试官,面试了这么多人之后的感想,希望对大家有一点点帮助. Java相关 容器(HashMap.HashSet.Lin ...

  5. Java软件开发面试题!2021年京东Java岗面试必问

    前言 面试技巧另外开篇再说,先上面试干货吧.面试的题目并不一定有严格的顺序关系,有的是从前一个问题延伸而来,(探究的是一个知识的深度),有的是考察面试者的知识广度.有的纯粹是我想到哪里写到哪里的啦.. ...

  6. C++软件开发面试题总结

    面试题有难有易,不能因为容易,我们就轻视,更不能因为难,我们就放弃.我们面对高薪就业的态度永远不变,那就是坚持.坚持.再坚持.出现问题,找原因:遇到困难,想办法.我们一直坚信只有在坚持中才能看到希望, ...

  7. 深信服 linux软件开发面试题整理

    1.结构体可以进行比较 int memcmp ( const void * ptr1, const void * ptr2, size_t num ); Compare two blocks of m ...

  8. Android软件开发面试题,安卓面试题库

    一.开始的开始 **Android框架体系架构(高级UI+FrameWork源码)**这块知识是现今使用者最多的,我们称之Android2013~2016年的技术,但是,即使是这样的技术,Androi ...

  9. 2023年最新大厂开发面试题(滴滴,华为,京东,腾讯,头条)

    2023年最新大厂开发面试题!!! 滴滴篇 B+树.B-树的区别? 数据库隔离级别,幻读和不可重复读的区别? 有 hell, well, hello, world 等字符串组,现在问能否拼接成 hel ...

最新文章

  1. SaaS创业型企业如何打破销售瓶颈?
  2. 开启mysql远程访问的权限
  3. ubuntu9.10回收站目录
  4. python gevent缺点_python的flask框架结合gevent性能反而大幅度下降?
  5. urllib库的使用
  6. 利用python求解节点介数和边介数
  7. 比对两个数据库中数据表结构异同
  8. 「leetcode」 1382. 将二叉搜索树变平衡:【构造平衡二叉搜索树】详解
  9. 电信光猫华硕路由器端口转发
  10. 高数 | 【多元函数微分学】如何判断二元微分式是否为全微分
  11. 苹果鼠标右键怎么按_如何在Mac上使用多点触控手势?苹果MacOSX系统常用多点触摸板操作手势教程...
  12. 华氏温度转换为摄氏温度,c语言实例一
  13. WPS-Word:下一页分节符不能分页,插入下一页分节符时下一节没有在新的一页开始
  14. 计算机小学期实践报告,小学期计算机实践报告
  15. 学习记录 --【零基础CSS学习】03.ID选择器和类选择器
  16. 阿里云服务器的购买和部署
  17. 【陈工笔记】# 如何用WPS演示给PPT加水印 #
  18. 中式客厅装修的特点 亦古亦今的惊艳每一家
  19. references column 'xxx' which is not in SELECT list
  20. H.265视频流媒体EasyPlayer播放器无法禁用自动播放的问题修复

热门文章

  1. python京东注册账号_Python爬虫模拟登录京东获取个人信息
  2. python引入自己写的文件_python引入自己写的Py文件
  3. 用hundred造句子_关于冬至的问候短句,冬至文案唯美句子
  4. 核心频率个加速频率_仅少数Ryzen 9 3900X能摸到官方最大加速频率,其他处理器也有这问题...
  5. vb与三菱plc以太网通讯_实战演练|三菱触摸屏GOT2000与三菱Q系列以太网通讯
  6. 图像处理——图像边缘检测
  7. python中的正则表达式是干嘛的_操作python中的正则表达式(上)
  8. 华为手机怎么隐藏按键图标_华为手机隐藏技巧,一键简单设置,让沟通更加便捷...
  9. python安装好了怎么打不开机_安装后无法启动MySQL怎么办
  10. 手机隔空充电,会有辐射吗?