关于阿里的一道笔试题分析

其题目如下:

?





1

2

3

4

5

6

7

8

9

10

11

12

13

14

#pragma pack(2)

class
A

{

public:

    int
i;

    union
U

    {

        char
buff[13];

        int
i;

    }u;

    void
foo() {    }

    typedef
char* (*f)(void*);

    enum{red, green, blue} color;

}a;

class A 在32位 sizeof的结果为?

答案是22.

首先,我们看到在代码头部的申明:

?





1

#pragma pack(2)

表示使用2个字节对齐,也就是说,每个成员的内存地址,相对与基地址的偏移量是能够与2整除的。

使用以下代码进行分析:

?





1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

#include <iostream>

using
namespace std;

int main(int
argc, const
char * argv[])

{

    

    cout << "siize of class A is:"
<< sizeof(a) << endl;

    

    cout << "offset of A.i is:"
<<(size_t)&(((A*)0)->i) << endl;

    

    cout << "offset of A.u is:"
<<(size_t)&(((A*)0)->u) << endl;

    

    cout << "offset of A.color is:"
<<(size_t)&(((A*)0)->color) << endl;

    

    cout << "seize of A.u is:"
<< sizeof(a.u) << endl;

    

    cout << "seize of A.u.buff is:"
<< sizeof(a.u.buff) << endl;

    return
0;

}

  输出结果:

?





1

2

3

4

5

6

siize of class
A is:22

offset of A.i is:0

offset of A.u is:4

offset of A.color is:18

seize of A.u is:14

seize of A.u.buff is:13

  可以看到,i成员的地址偏移量为0,占用4个字节,4%2 = 0,所以 成员u的便宜为 4。

  成员u是一个共同体,共同体的大小为其占用空间最大的成员的大小,这里是 A.u.buffer。

  A.b.buffer 为char数组 占用空间为: 1 * 13,由于 13%2 != 0,编译器会补上一个字节使其对其: 1*13+1 % 2 =
0。

  于是下一个成员的偏移为:4+14 = 18,成员 color的偏移为18,color为 enum,占用4个字节,所以sizeof(A) = 18 +
4 = 22
  

关于阿里的一道笔试题分析,布布扣,bubuko.com

时间: 2024-10-12 17:39:17

关于阿里的一道笔试题分析的相关文章

一道笔试题来理顺Java中的值传递和引用传递

前段时间参加了一场面试,其中有一道引用传递的题,因为当时并没有考虑清楚所以做错了. 现在来复盘一下,题目如下: private static void change(StringBuffer str11, StringBuffer str12) { str12 = str11; str11 = new StringBuffer("new world"); str12.append("new world");} public static void main(Stri

Java中有关构造函数的一道笔试题解析

Java中有关构造函数的一道笔试题解析 1.具体题目如下 下列说法正确的有() A. class中的constructor不可省略 B. constructor必须与class同名,但方法不能与class同名 C. constructor在一个对象被new时执行 D.一个class只能定义一个constructor 2.解析说明 (1)class中的构造函数是可以省略的 /** * @Title:User.java * @Package:com.you.user.model * @Descrip

0810------笔试题----------腾讯2012年的一道笔试题

1.题目要求 a)b[i] = a[0] *a[1] *a[2]*….a[n-1]/ a[i],求出数组b: b)要求不能用除法,除循环控制变量以外,不许额外申请其余变量,时间复杂度为O(n),空间复杂度为O(1). 2.程序思路 a)假设 N = 5,那么 b[0] =      a[1]*a[2]*a[3]*a[4];            b[1] = a[0]*     a[2]*a[3]*a[4];            b[2] = a[0]*a[1]*     a[3]*a[4];

好玩的一道笔试题

/*实现函数: void f(int a, int b, int c) 编码中不允许出现燃和if,switch,for,while之类的关键词以及"?:"表达式,并要求: a=1时,打印b+c的值: a=2时,打印b-c的值: a=3时,打印b*c的值: a=4时,打印b/c的值. */ 下面是我的解答,哈哈: #include <iostream> int cal(int a,int b, int c){ int res = 0; (!(a^1) && (

送上今年微软的一道笔试题

这里送上一道微软的笔试题,具体题目如下: Time Limit: 10000msCase Time Limit: 1000msMemory Limit: 256MB Description Consider a string set that each of them consists of {0, 1} only. All strings in the set have the same number of 0s and 1s. Write a program to find and outp

给定一个数值,输出符合中国人习惯的读法--记一道笔试题

题目:给定一个数字,最大小于一万亿,输出符合中国人习惯的读法,例如: a.12输出:十二 b.102输出:一百零二 c.1002输出:一千零二 d.112输出:一百十二 e.10112输出:一万零一百十二 f.120000000:一亿二千万 g.11021002:一千一百零二万一千零二 h.11020102:一千一百零二万零一百零二 i.1000001:一百万零一 j.1000000001:十亿零一 嗯,一道笔试题,解的很没有节操,没有太好的思路,只能尽力抽取翻译过程中的共有代码,尽量写的不那么

2014.3.29阿里巴巴暑期实习笔试题分析

参考:http://blog.csdn.net/iloveyoujelly/article/details/22941531 下面中的[分析]是我给出的. 2014.3.29阿里巴巴暑期实习笔试题分析 一.单选 1.假设一个主机ip为192.168.5.121,子网掩码为255.255.255.248,则该主机的网络号部分(包括子网号部分)为-- A.192.168.5.12  B 192.168.5.121   C 192.168.5.120   D 192.168.5.32 参考答案 C [

js原型链的一些发现----来自一道笔试题

1.开篇 1.1本文目标 这是我真正意义上的博客,一是想记录下自己学到的东西,二是想写博客也是对自己的一种历练,自己的一次新的尝试. 废话不多说,说下这次写这篇东东的原因.js的原型链是让我很头疼的事情,每次碰到一些相关的题目和代码都让我有点不知所措.最近的一次笔试碰到了一道相关的题目,不出所料,没有答出来.回来对此钻研一通,不断地查资料测试代码,终于有了点收获,正好最近开始玩博客,所以写了这篇记录. PS:我基础并不好,所以这篇文章可能不会是那种大牛级的专业博客.如果有幸让大神们看到这篇文章,

一道阿里的在线笔试题

如需转载请留言. 题目如下: 有一个消息队列集群,集群里每台Broker的响应时间RT都不一样,但是每台Broker的极限服务QPS都是一样的,超过这个QPS会出现过载雪崩.而消息的生产者客户端,每次发送都会选择其中的一台broker来发送,一般来说发送逻辑是运行在一个线程池里面.假设cpu资源充足,通过实现一个负载均衡算法,使得生产者能够达到最大吞吐量,最优的平均响应时间,但是又不能把任何一台服务器压垮.已知每个broker的rt.极限qps,消息生产者的线程数量,请求总数,如果采用吞吐量最优